这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制。这里要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 @Override18 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 @Override32 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 @Override57 public boolean onKeyUp(int keyCode, KeyEvent event) {58 return super.onKeyUp(keyCode, event);59 }60 61 // /**62 // * 重写触屏事件函数63 // */64 // @Override65 // 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 @Override87 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 @Override110 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {111 }112 /**113 * SurfaceView视图消亡时,响应此函数114 */115 @Override116 public void surfaceDestroyed(SurfaceHolder holder) {117 flag = false;118 }119 }
本文链接:
更多精彩: