当前位置: 首页 > news >正文

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

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/4230252.html,如需转载请自行联系原作者

相关文章:

  • JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
  • iOS快速集成支付宝
  • Commons.net FTPClient 上传文件
  • AIO - 概述
  • Azure Redis Cache (5) Redis Cache Cluster集群模式
  • 白盒测试
  • SQL Server 2008 部分改变
  • Python将被加入高考科目
  • [转]使用WinINet和WinHTTP
  • Microsoft Ribbon for WPF 正式发布
  • 【原创】简单的局域网内无线文件传输(1)
  • 给初学者:JavaScript 中数组操作注意点
  • 阿里研究院崔瀚文:“单身经济”背后的“新家园”
  • 在Hyper-V下Linux不能使用鼠标
  • 005——VUE中的v-text与v-html的使用
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript学习总结——原型
  • Java程序员幽默爆笑锦集
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nodejs实现webservice问题总结
  • Solarized Scheme
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • spring security oauth2 password授权模式
  • vue脚手架vue-cli
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 后端_ThinkPHP5
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端相关框架总和
  • 浅谈web中前端模板引擎的使用
  • 数组大概知多少
  • 用jQuery怎么做到前后端分离
  • Java数据解析之JSON
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)选择元素——(17)练习(Exercises)
  • (33)STM32——485实验笔记
  • (附源码)php投票系统 毕业设计 121500
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)Android布局类型(线性布局LinearLayout)
  • (五)关系数据库标准语言SQL
  • (一)RocketMQ初步认识
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)scrum常见工具列表
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net mvc总结
  • .net 后台导出excel ,word
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 生成二级域名
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)