`

Android SurfaceView游戏开发示例

阅读更多

 

当我们需要开发一个复杂游戏的时候,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发。

例如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进行开发。例如,对速度要求很高的游戏,可以使用双缓冲来显示。游戏中的背景、人物、动画等都需要绘制在一个画布(Canvas)上,而SurfaceView可以直接访问一个画布,SurfaceView 是提供给需要直接画像素而不是使用窗体部件的应用使用的。 每个Surface创建一个Canvas对象(但属性时常改变),用来管理View和Surface上的绘图操作。 

 

具体示例:

Activity

 

  1. public class Activity01 extends Activity {  
  2.       
  3.     GameSurfaceView gameView = null;  
  4.       
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.          
  9.         gameView = new GameSurfaceView(this);  
  10.         setContentView(gameView);  
  11.     }  
  12. }  

 

 

GameSurfaceView

 

  1. public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{  
  2.   
  3.     private Activity01 mActivity = null;  
  4.       
  5.     private SurfaceHolder mHolder = null;  
  6.     private Thread mThread = null;;  
  7.     private boolean mLoop = false;  
  8.       
  9.     private Canvas mCanvas = null;  
  10.     private Paint mPaint = null;  
  11.     private long drawStartTime = 0, drawCostTime = 0, drawTotalTime = 30;  
  12.       
  13.     private float x, y;  
  14.     private int screenWidth = 480, screenHeight = 800;  
  15.       
  16.     public GameSurfaceView(Context context) {  
  17.         super(context);  
  18.   
  19.         mActivity = (Activity01)context;  
  20.           
  21.         mHolder = this.getHolder();  
  22.         mHolder.addCallback(this);  
  23.         setFocusable(true);  
  24.     }  
  25.   
  26.     @Override  
  27.     public void surfaceCreated(SurfaceHolder holder) {  
  28.         mPaint = new Paint();  
  29.         mPaint.setColor(Color.CYAN);  
  30.         mLoop = true;  
  31.           
  32.         new Thread(this).start();  
  33.     }  
  34.   
  35.     @Override  
  36.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  37.         screenWidth = width;  
  38.         screenHeight = height;  
  39.           
  40.         x = screenWidth / 2;  
  41.         y = screenHeight / 2;  
  42.     }  
  43.   
  44.     @Override  
  45.     public void surfaceDestroyed(SurfaceHolder holder) {  
  46.         mLoop = false;  
  47.     }  
  48.   
  49.     @Override  
  50.     public void run() {  
  51.         while(mLoop){  
  52.             drawStartTime = SystemClock.uptimeMillis();  
  53.               
  54.             synchronized (mHolder) {  
  55.                 try {  
  56.                     mCanvas = mHolder.lockCanvas();  
  57.                     onDraw();       // repaint  
  58.                 } catch (Exception e) {  
  59.                     e.printStackTrace();  
  60.                 } finally {  
  61.                     if(mCanvas != null){  
  62.                         mHolder.unlockCanvasAndPost(mCanvas);  
  63.                     }  
  64.                 }  
  65.             }  
  66.               
  67.             drawCostTime = SystemClock.uptimeMillis() - drawStartTime;  
  68.             Log.i("drawCostTime""drawCostTime = " + drawCostTime);  
  69.             try {  
  70.                 if(drawCostTime < drawTotalTime){  
  71.                     Thread.sleep(drawTotalTime - drawCostTime);     // sleep elapse time  
  72.                 }  
  73.             } catch (Exception e) {  
  74.                 e.printStackTrace();  
  75.             }  
  76.         }  
  77.     }  
  78.       
  79.     private void onDraw(){  
  80.         if(mHolder == null && mPaint == null){  
  81.             return;  
  82.         }  
  83.           
  84.         mPaint.setAntiAlias(true);  
  85.         mPaint.setAlpha(100);  
  86.           
  87.         mPaint.setColor(Color.CYAN);    // paint background color  
  88.         mCanvas.drawRect(00, screenWidth, screenHeight, mPaint);  
  89.           
  90.         mPaint.setColor(Color.BLUE);    // paint foreground color  
  91.         mCanvas.drawCircle(x, y, 50, mPaint);  
  92.     }  
  93.       
  94.     @Override  
  95.     public boolean onTouchEvent(MotionEvent event) {  
  96.         super.onTouchEvent(event);  
  97.   
  98.         switch (event.getAction()) {  
  99.         case MotionEvent.ACTION_DOWN:  
  100.             this.x = event.getX();  
  101.             this.y = event.getY();  
  102.             break;  
  103.   
  104.         case MotionEvent.ACTION_MOVE:  
  105.             this.x = event.getX();  
  106.             this.y = event.getY();  
  107.             break;  
  108.   
  109.         case MotionEvent.ACTION_UP:  
  110.             this.x = event.getX();  
  111.             this.y = event.getY();  
  112.             break;  
  113.   
  114.         default:  
  115.             this.x = event.getX();  
  116.             this.y = event.getY();  
  117.             break;  
  118.         }  
  119.   
  120.         return true;    // true then event can be implemented again  
  121.     }  
  122.   
  123.     @Override  
  124.     public boolean onKeyDown(int keyCode, KeyEvent event){  
  125.         super.onKeyDown(keyCode, event);  
  126.           
  127.         if(keyCode == KeyEvent.ACTION_DOWN){  
  128.             this.mActivity.finish();  
  129.         }  
  130.           
  131.         return true;  
  132.     }  
  133. }  


运行效果:

 

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    android surfaceview示例源码下载

    android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...

    Android游戏开发20回合

    Android游戏开发13 Sensor感应示例 Android游戏开发14 游戏开发实战一 Android游戏开发15 按键中断处理 Android游戏开发16 异步音乐播放 Android游戏开发17 图像渐变特效 Android游戏开发18 SoundPool类 Android游戏...

    Android游戏开发之旅

    13.Android游戏开发之旅13 Sensor感应示例 14.Android游戏开发之旅14 游戏开发实战一 15.Android游戏开发之旅15 按键中断处理 16.Android游戏开发之旅16 异步音乐播放 17.Android游戏开发之旅17 图像渐变特效

    Android SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常

    本文主要介绍Android SurfaceView运行机制,这里整理了详细的资料来讲解SurfaceView的运行原理,并附示例代码参考,有需要的小伙伴可以参考下

    Android 游戏开发入门简单示例

    在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬。那怎样开发Android游戏呢?下面介绍一个简单的入门实例。  一、创建新工程   首先,我们在Eclipse中新建一个名为...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    android开发资料大全

    Android3D游戏开发付费视频教程共享(更新第四集) 史上最全示例Android教学视频,非常值得观看 Android游戏开发系列源码+CHM+书籍截图+目录】 Android developer guide中文翻译文档 Android开发开发技巧之 EditText...

    Android高级编程--源代码

    作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...

    Android应用源码安卓源码(172个合集).zip

    OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单...

    Android开发实现的简单媒体播放器功能示例

    主要介绍了Android开发实现的简单媒体播放器功能,结合实例形式分析了Android基于surfaceview实现多媒体视频及音频播放的相关操作技巧,需要的朋友可以参考下

    《Android高级编程》

    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调试桥...

    疯狂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 安装...

    Beginning.Android.Games 非常专业的Android入门书籍

    非常棒的Android游戏开发资源,潜心研究,可开发常见的动作类游戏。 示例实用: 贪吃蛇。SurfaceView 重力感应器控制的是男人就蹦.opengl 3D 版外星人入侵战机游戏。 希望能帮助你。

    Android高级编程.pdf

    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应用...

    Android最新资料以及源码

    21、Android异步加载源码示例 共5个目标文件!简单。异步加载,通过异步加载外部网站的多张图片,来介绍和演示Android环境下如何去实现文件异步加载功能,想搞Android软件开发的新手,有必要掌握 的一个技巧,程序...

    详解Android 折叠屏适配攻略

    主要介绍了Android 折叠屏适配攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Android代码-Android上专为视屏直播打造的轻量级弹幕库(100多kb)

    Android上专为视频直播打造的轻量级弹幕库(100多kb) demo运行后的效果如下: 下载示例Apk 目前支持以下需求 继承自View实现的DanMuView(直播间的弹幕,推荐使用这种) 继承自SurfaceView实现的DanMuView 支持...

    android源码包集合3

    OPENG开发的示例代码.rar OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar PopWindow.rar Preference_Demo.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录...

Global site tag (gtag.js) - Google Analytics