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

时间: 2024-08-27 03:33:14

[安卓] 8、VIEW和SURFACEVIEW游戏框架的相关文章

【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfaceView",此类继承SurfaceView,并实现android.view.SurfaceHolder.Callback 接口,代码如下 package com.example.ex4_5; import android.content.Context; import android.graphi

【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)

对于玩家来说,游戏是动态的:对于游戏开发人员来说,游戏是静态的,只是不停地播放不通的画面,让玩家看到了动态的效果. 进入Android之前,首先要熟悉三个重要的类:View(视图).Canvas(画布).Paint(画笔).通过画笔,可以在画布上画出各种精彩的图形.图片等等,然后通过视图可以将画布上的内容展现在手机屏幕上. 其次要熟悉“刷屏”的概念.绘制在画布中的图像不管是图片还是图形,都是静态的,只有通过不断的展现不同的画布,才能实现动态的效果.在手机上,画布永远只是一张,所以不可能通过不断地

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

Android进阶笔记05:View、SurfaceView 和GLSurfaceView 的关系和区别

1.  Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:    (1) view.SurfaceView 和 GLSurfaceView的区别如下: • View: 显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,速度较慢 • SurfaceView: 基于view视图进行拓展的视图类,更适合2D游戏的开发:是View的子类,类似使用双缓机制

Android之View和SurfaceView

Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:view.SurfaceView和GLSurfaceView. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,速度较慢. SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发:是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view

Android游戏框架Libgdx使用入门

转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ Libgdx项目地址:http://code.google.com/p/libgdx/ Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能执行在Mac.Linux.Windows等系统)与Android平台(Android1.5以上就可以使用.Andro

【开源java游戏框架libgdx专题】-05-模块描述与上下文

模块描述(Modules overview) Input:为所有的平台提供一个统一的输入模型和处理程序. 获取触摸示例: 1 if (Gdx.input.isTouched()) { 2 System.out.println("Input occurred at x="+Gdx.input.getX() +", y="+Gdx.input.getY()); 3 } Graphics:能够使用硬件提供的OpenGL ES在屏幕上绘制图片 获取OpenGL API 2.

C#游戏框架uFrame

C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到目录 1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它向开发者提供了一套基于Editor的可视化编辑工具,可以用来管理代码结构等.需要指出的是它的一

View 和 SurfaceView的区别

这里说的是在绘图中两者的区别: 1View在绘图中,重写onDraw(Canvas canvas)方法,通过invaldate()和pastInvalidate()两个方法进行重新绘制画布; invalidate()不能再自己创建的线程中循环调用: postInvalidate()可以在自己创建的线程中循环调用执行.如果不在当前View 创建线程循环重绘画布的话,这两种重绘画布的函数就没什么区别了,都可以用. public class MyView extends View { private