`

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游戏开发

    文件"example_surfaceview2"可能包含了使用SurfaceView进行游戏开发的示例代码,包括SurfaceHolder的回调函数实现、游戏循环的编写、触摸事件处理等。通过学习和理解这些代码,开发者可以更好地掌握SurfaceView在...

    android SurfaceView游戏框架

    在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...

    android之surfaceview学习示例

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形渲染的能力。SurfaceView的设计初衷是为了处理那些需要频繁更新且对性能要求较高的场景,如视频播放、游戏画面...

    android surfaceview示例源码下载

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

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    android surfaceview自定义拍照 绘制头像轮廓

    在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...

    android SurfaceView 使用示例 why SurfaceView上 不可以用控件的轻微解释

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了与硬件图形渲染引擎直接交互的能力,常用于处理高性能、低延迟的视频或者游戏画面。SurfaceView的底层机制使其能够独立于UI主线程进行渲染,避免了频繁...

    Android SurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,比如游戏、视频播放等需要频繁更新画面的应用。SurfaceView有一个特点,就是它的内容在窗口的最顶层,通常不会被其他普通View...

    Android SurfaceView添加组件view不被组件覆盖-IT计算机-毕业设计.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏或者视频播放器。SurfaceView具有自己的绘制表面,与主线程分离,因此可以进行独立于UI线程的高性能渲染。...

    Android SurfaceView使用Demo

    总之,`SurfaceView` 是 Android 应用开发中用于实现高性能图形渲染的重要工具,理解其工作原理和使用方式对于开发高质量、流畅的应用至关重要。在实际项目中,根据需求选择合适的视图组件,能够有效提升用户体验。

    Android SurfaceView 多线程 滑块

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行绘制操作,从而提高图形渲染性能,特别适用于需要连续更新显示内容的应用,如游戏、视频播放等。本示例中,"Android SurfaceView 多...

    android游戏开发示例

    "android游戏开发示例"这个项目可能是一个实例教程或者代码库,它提供了Android平台上游戏开发的具体实践。通过链接(http://blog.csdn.net/lan410812571/article/details/9717561)可以获取更详细的说明,虽然具体...

    安卓Android源码——(SurfaceView游戏框架).zip

    这个压缩包"安卓Android源码——(SurfaceView游戏框架).zip"可能包含了实现基于SurfaceView的游戏框架的示例代码和相关教程。 SurfaceView的主要特点包括: 1. **双缓冲机制**:SurfaceView内部实现了双缓冲,可以...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...

    安卓Android源码——(SurfaceView游戏框架).rar

    这份"安卓Android源码——(SurfaceView游戏框架).rar"资源很可能包含了一个实现基于SurfaceView的游戏框架的示例代码。 SurfaceView的核心特点在于它拥有自己的Surface,这个Surface存在于应用窗口的顶层,并且有...

    Android SurfaceView实现动画效果

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于游戏或者视频播放等需要连续更新显示内容的场景。本篇文章将详细探讨如何利用SurfaceView实现动画效果,...

    Android圆形相机预览窗口,圆形SurfaceView

    在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...

    android之view和surfaceview用法示例汇总

    在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们用于在屏幕上显示内容和处理用户交互。本文将详细解析View和SurfaceView的基本概念、用法以及它们之间的区别,通过实例代码来帮助理解。 **一、...

    安卓Android源码——SurfaceView添加组件view不被组件覆盖.zip

    在安卓开发中,`SurfaceView` 是一个非常重要的视图组件,它允许开发者在应用程序中创建一个独立于窗口管理器的表面,这个表面可以用于显示持续更新的图像,如视频播放或者游戏画面。`SurfaceView` 提供了一个优化的...

Global site tag (gtag.js) - Google Analytics