• [安卓] 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/

  • 相关阅读:
    js下拉列表效果
    js格式化数字/日期
    通用的网页上的播放本地视频文件
    综合
    componentartclientmodeediting
    ESC键
    asp.net/ajax
    转载MS AJAX
    不允许进行远程连接可能会导致此失败 error: 40
    2007.9.17
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/4230252.html
Copyright © 2020-2023  润新知