[安卓] 8、VIEW和SURFACEVIEW游戏框架

 

 


这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制。这里要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 }

 

 

 

 

本文链接:http://www.cnblogs.com/zjutlitao/p/4230252.html

更多精彩:http://www.cnblogs.com/zjutlitao/p/

 

posted @ 2015-01-17 11:28  beautifulzzzz  阅读(1237)  评论(0编辑  收藏  举报