当我们需要开发一个复杂游戏的时候,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发。
例如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进行开发。例如,对速度要求很高的游戏,可以使用双缓冲来显示。游戏中的背景、人物、动画等都需要绘制在一个画布(Canvas)上,而SurfaceView可以直接访问一个画布,SurfaceView 是提供给需要直接画像素而不是使用窗体部件的应用使用的。 每个Surface创建一个Canvas对象(但属性时常改变),用来管理View和Surface上的绘图操作。
具体示例:
Activity
- public class Activity01 extends Activity {
-
- GameSurfaceView gameView = null;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- gameView = new GameSurfaceView(this);
- setContentView(gameView);
- }
- }
GameSurfaceView
- public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
-
- private Activity01 mActivity = null;
-
- private SurfaceHolder mHolder = null;
- private Thread mThread = null;;
- private boolean mLoop = false;
-
- private Canvas mCanvas = null;
- private Paint mPaint = null;
- private long drawStartTime = 0, drawCostTime = 0, drawTotalTime = 30;
-
- private float x, y;
- private int screenWidth = 480, screenHeight = 800;
-
- public GameSurfaceView(Context context) {
- super(context);
-
- mActivity = (Activity01)context;
-
- mHolder = this.getHolder();
- mHolder.addCallback(this);
- setFocusable(true);
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- mPaint = new Paint();
- mPaint.setColor(Color.CYAN);
- mLoop = true;
-
- new Thread(this).start();
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- screenWidth = width;
- screenHeight = height;
-
- x = screenWidth / 2;
- y = screenHeight / 2;
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- mLoop = false;
- }
-
- @Override
- public void run() {
- while(mLoop){
- drawStartTime = SystemClock.uptimeMillis();
-
- synchronized (mHolder) {
- try {
- mCanvas = mHolder.lockCanvas();
- onDraw();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if(mCanvas != null){
- mHolder.unlockCanvasAndPost(mCanvas);
- }
- }
- }
-
- drawCostTime = SystemClock.uptimeMillis() - drawStartTime;
- Log.i("drawCostTime", "drawCostTime = " + drawCostTime);
- try {
- if(drawCostTime < drawTotalTime){
- Thread.sleep(drawTotalTime - drawCostTime);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- private void onDraw(){
- if(mHolder == null && mPaint == null){
- return;
- }
-
- mPaint.setAntiAlias(true);
- mPaint.setAlpha(100);
-
- mPaint.setColor(Color.CYAN);
- mCanvas.drawRect(0, 0, screenWidth, screenHeight, mPaint);
-
- mPaint.setColor(Color.BLUE);
- mCanvas.drawCircle(x, y, 50, mPaint);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- super.onTouchEvent(event);
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- this.x = event.getX();
- this.y = event.getY();
- break;
-
- case MotionEvent.ACTION_MOVE:
- this.x = event.getX();
- this.y = event.getY();
- break;
-
- case MotionEvent.ACTION_UP:
- this.x = event.getX();
- this.y = event.getY();
- break;
-
- default:
- this.x = event.getX();
- this.y = event.getY();
- break;
- }
-
- return true;
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event){
- super.onKeyDown(keyCode, event);
-
- if(keyCode == KeyEvent.ACTION_DOWN){
- this.mActivity.finish();
- }
-
- return true;
- }
- }
运行效果:
更多信息请查看 java进阶网 http://www.javady.com
分享到:
相关推荐
android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...
Android游戏开发13 Sensor感应示例 Android游戏开发14 游戏开发实战一 Android游戏开发15 按键中断处理 Android游戏开发16 异步音乐播放 Android游戏开发17 图像渐变特效 Android游戏开发18 SoundPool类 Android游戏...
13.Android游戏开发之旅13 Sensor感应示例 14.Android游戏开发之旅14 游戏开发实战一 15.Android游戏开发之旅15 按键中断处理 16.Android游戏开发之旅16 异步音乐播放 17.Android游戏开发之旅17 图像渐变特效
本文主要介绍Android SurfaceView运行机制,这里整理了详细的资料来讲解SurfaceView的运行原理,并附示例代码参考,有需要的小伙伴可以参考下
在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬。那怎样开发Android游戏呢?下面介绍一个简单的入门实例。 一、创建新工程 首先,我们在Eclipse中新建一个名为...
最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...
Android3D游戏开发付费视频教程共享(更新第四集) 史上最全示例Android教学视频,非常值得观看 Android游戏开发系列源码+CHM+书籍截图+目录】 Android developer guide中文翻译文档 Android开发开发技巧之 EditText...
作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...
OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单...
主要介绍了Android开发实现的简单媒体播放器功能,结合实例形式分析了Android基于surfaceview实现多媒体视频及音频播放的相关操作技巧,需要的朋友可以参考下
2.2 面向移动设备的开发 2.2.1 关于硬件设计的考虑事项 2.2.2 考虑用户环境 2.2.3 Android开发 2.3 To-Do List示例 2.4 Android开发工具 2.4.1 Android模拟器 2.4.2 Dalvik调试监控服务(DDMS) 2.4.3 Android调试桥...
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装...
非常棒的Android游戏开发资源,潜心研究,可开发常见的动作类游戏。 示例实用: 贪吃蛇。SurfaceView 重力感应器控制的是男人就蹦.opengl 3D 版外星人入侵战机游戏。 希望能帮助你。
1.8 从事Android开发的原因 1.8.1 推动Android普及的因素 .1.8.2 Android的独到之处 1.8.3 改变移动开发格局 1.9 开发框架简介 1.9.1 开发包中的资源 1.9.2 理解Android软件栈 1.9.3 Dalvik虚拟机 1.9.4 Android应用...
21、Android异步加载源码示例 共5个目标文件!简单。异步加载,通过异步加载外部网站的多张图片,来介绍和演示Android环境下如何去实现文件异步加载功能,想搞Android软件开发的新手,有必要掌握 的一个技巧,程序...
主要介绍了Android 折叠屏适配攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Android上专为视频直播打造的轻量级弹幕库(100多kb) demo运行后的效果如下: 下载示例Apk 目前支持以下需求 继承自View实现的DanMuView(直播间的弹幕,推荐使用这种) 继承自SurfaceView实现的DanMuView 支持...
OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar PopWindow.rar Preference_Demo.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录...