这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制。这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第10行设置显示的VIEW.
1 public class MainActivity extends Activity { 2 @Override 3 public void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 //隐去标题栏(应用程序的名字) 6 this.requestWindowFeature(Window.FEATURE_NO_TITLE); 7 //隐去状态栏部分(电池等图标和一切修饰部分) 8 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 9 //设置显示View实例 10 setContentView(new MyView(this)); 11 } 12 }
在MyView中主要是集成View,里面有构造函数、onDraw、onKeyDown、onKeyUp、onTouchEvent等,其中最主要的就是canvas的应用,这里可以吧canvas看做是一张白纸,你可以在上面按照你的意图进行绘制。
1 public class MyView extends View { 2 private int textX = 20, textY = 20; 3 4 /** 5 * 重写父类构造函数 6 * @param context 7 */ 8 public MyView(Context context) { 9 super(context); 10 setFocusable(true); 11 // setFocusableInTouchMode(true); 12 } 13 14 /** 15 * 重写父类绘图函数 16 */ 17 @Override 18 protected void onDraw(Canvas canvas) { 19 //创建一个画笔的实例 20 Paint paint = new Paint(); 21 //设置画笔的颜色 22 paint.setColor(Color.WHITE); 23 //绘制文本 24 canvas.drawText("Game", textX, textY, paint); 25 super.onDraw(canvas); 26 } 27 28 /** 29 * 重写按键按下事件函数 30 */ 31 @Override 32 public boolean onKeyDown(int keyCode, KeyEvent event) { 33 //判定用户按下的键值是否为方向键的“上下左右”键 34 if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { 35 //“上”按键被点击,应该让文本的Y坐标变小 36 textY -= 2; 37 } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { 38 //“下”按键被点击,应该让文本的Y坐标变大 39 textY += 2; 40 } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 41 //“左”按键被点击,应该让文本的X坐标变小 42 textX -= 2; 43 } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { 44 //“右”按键被点击,应该让文本的X坐标变大 45 textX += 2; 46 } 47 //重绘画布 48 invalidate(); 49 //postInvalidate(); 50 return super.onKeyDown(keyCode, event); 51 } 52 53 /** 54 * 重写按键抬起事件函数 55 */ 56 @Override 57 public boolean onKeyUp(int keyCode, KeyEvent event) { 58 return super.onKeyUp(keyCode, event); 59 } 60 61 // /** 62 // * 重写触屏事件函数 63 // */ 64 // @Override 65 // public boolean onTouchEvent(MotionEvent event) { 66 // int x = (int)event.getX(); 67 // int y = (int)event.getY(); 68 // //玩家手指点击屏幕的动作 69 // if (event.getAction() == MotionEvent.ACTION_DOWN) { 70 // textX = x; 71 // textY = y; 72 // //玩家手指抬起离开屏幕的动作 73 // } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 74 // textX = x; 75 // textY = y; 76 // //玩家手指在屏幕上移动的动作 77 // } else if (event.getAction() == MotionEvent.ACTION_UP) { 78 // textX = x; 79 // textY = y; 80 // } 81 // //重绘画布 82 // invalidate(); 83 // //postInvalidate(); 84 // return true; 85 // } 86 @Override 87 public boolean onTouchEvent(MotionEvent event) { 88 //获取用户手指触屏的X坐标赋值与文本的X坐标 89 textX = (int)event.getX(); 90 //获取用户手指触屏的Y坐标赋值与文本的Y坐标 91 textY = (int)event.getY(); 92 //重绘画布 93 invalidate(); 94 //postInvalidate(); 95 return true; 96 } 97 }
surfaceView框架和View框架类似,仍然需要一个MainActivity做相应的设置,然后剩下的任务就交给SurfaceView了:MySurfaceView为构造函数,surfaceCreated视图创建响应该函数,onTouch和onKey都是类似的用户操作响应函数,最重要的是run函数,该函数是线程的run函数,该函数将一直执行不断处理屏幕绘制和逻辑变化,来实现动画与交互的效果。
1 public class MySurfaceView extends SurfaceView implements Callback, Runnable { 2 //用于控制SurfaceView 3 private SurfaceHolder sfh; 4 //声明一个画笔 5 private Paint paint; 6 //文本的坐标 7 private int textX = 10, textY = 10; 8 //声明一条线程 9 private Thread th; 10 //线程消亡的标识位 11 private boolean flag; 12 //声明一个画布 13 private Canvas canvas; 14 //声明屏幕的宽高 15 private int screenW, screenH; 16 /** 17 * SurfaceView初始化函数 18 */ 19 public MySurfaceView(Context context) { 20 super(context); 21 //实例SurfaceHolder 22 sfh = this.getHolder(); 23 //为SurfaceView添加状态监听 24 sfh.addCallback(this); 25 //实例一个画笔 26 paint = new Paint(); 27 //设置画笔颜色为白色 28 paint.setColor(Color.WHITE); 29 //设置焦点 30 setFocusable(true); 31 } 32 /** 33 * SurfaceView视图创建,响应此函数 34 */ 35 @Override 36 public void surfaceCreated(SurfaceHolder holder) { 37 screenW = this.getWidth(); 38 screenH = this.getHeight(); 39 flag = true; 40 //实例线程 41 th = new Thread(this); 42 //启动线程 43 th.start(); 44 } 45 /** 46 * 游戏绘图 47 */ 48 public void myDraw() { 49 try { 50 canvas = sfh.lockCanvas(); 51 if (canvas != null) { 52 //-----------利用填充矩形的方式,刷屏 53 ////绘制矩形 54 //canvas.drawRect(0,0,this.getWidth(), 55 //this.getHeight(), paint); 56 //-----------利用填充画布,刷屏 57 // canvas.drawColor(Color.BLACK); 58 //-----------利用填充画布指定的颜色分量,刷屏 59 canvas.drawRGB(0, 0, 0); 60 canvas.drawText("Game", textX, textY, paint); 61 } 62 } catch (Exception e) { 63 // TODO: handle exception 64 } finally { 65 if (canvas != null) 66 sfh.unlockCanvasAndPost(canvas); 67 } 68 } 69 /** 70 * 触屏事件监听 71 */ 72 @Override 73 public boolean onTouchEvent(MotionEvent event) { 74 textX = (int) event.getX(); 75 textY = (int) event.getY(); 76 return true; 77 } 78 /** 79 * 按键事件监听 80 */ 81 @Override 82 public boolean onKeyDown(int keyCode, KeyEvent event) { 83 return super.onKeyDown(keyCode, event); 84 } 85 /** 86 * 游戏逻辑 87 */ 88 private void logic() { 89 } 90 @Override 91 public void run() { 92 while (flag) { 93 long start = System.currentTimeMillis(); 94 myDraw(); 95 logic(); 96 long end = System.currentTimeMillis(); 97 try { 98 if (end - start < 50) { 99 Thread.sleep(50 - (end - start)); 100 } 101 } catch (InterruptedException e) { 102 e.printStackTrace(); 103 } 104 } 105 } 106 /** 107 * SurfaceView视图状态发生改变,响应此函数 108 */ 109 @Override 110 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 111 } 112 /** 113 * SurfaceView视图消亡时,响应此函数 114 */ 115 @Override 116 public void surfaceDestroyed(SurfaceHolder holder) { 117 flag = false; 118 } 119 }