当我们需要开发一个复杂游戏的时候,而且对程序的执行效率要求很高时,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
分享到:
相关推荐
文件"example_surfaceview2"可能包含了使用SurfaceView进行游戏开发的示例代码,包括SurfaceHolder的回调函数实现、游戏循环的编写、触摸事件处理等。通过学习和理解这些代码,开发者可以更好地掌握SurfaceView在...
在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形渲染的能力。SurfaceView的设计初衷是为了处理那些需要频繁更新且对性能要求较高的场景,如视频播放、游戏画面...
android中的surfaceview示例源码下载,Android SurfaceView在游戏开发中使用想当广泛,SurfaceView对于画面的控制有着更大的自由度,它不像View那样要用handler来更新,但是网上关于 SurfaceView使用这方面的参考...
在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...
在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...
在Android开发中,SurfaceView是一种特殊的视图组件,它提供了与硬件图形渲染引擎直接交互的能力,常用于处理高性能、低延迟的视频或者游戏画面。SurfaceView的底层机制使其能够独立于UI主线程进行渲染,避免了频繁...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,比如游戏、视频播放等需要频繁更新画面的应用。SurfaceView有一个特点,就是它的内容在窗口的最顶层,通常不会被其他普通View...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏或者视频播放器。SurfaceView具有自己的绘制表面,与主线程分离,因此可以进行独立于UI线程的高性能渲染。...
总之,`SurfaceView` 是 Android 应用开发中用于实现高性能图形渲染的重要工具,理解其工作原理和使用方式对于开发高质量、流畅的应用至关重要。在实际项目中,根据需求选择合适的视图组件,能够有效提升用户体验。
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行绘制操作,从而提高图形渲染性能,特别适用于需要连续更新显示内容的应用,如游戏、视频播放等。本示例中,"Android SurfaceView 多...
"android游戏开发示例"这个项目可能是一个实例教程或者代码库,它提供了Android平台上游戏开发的具体实践。通过链接(http://blog.csdn.net/lan410812571/article/details/9717561)可以获取更详细的说明,虽然具体...
这个压缩包"安卓Android源码——(SurfaceView游戏框架).zip"可能包含了实现基于SurfaceView的游戏框架的示例代码和相关教程。 SurfaceView的主要特点包括: 1. **双缓冲机制**:SurfaceView内部实现了双缓冲,可以...
在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...
这份"安卓Android源码——(SurfaceView游戏框架).rar"资源很可能包含了一个实现基于SurfaceView的游戏框架的示例代码。 SurfaceView的核心特点在于它拥有自己的Surface,这个Surface存在于应用窗口的顶层,并且有...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在单独的线程中进行高性能的图形绘制,常用于游戏或者视频播放等需要连续更新显示内容的场景。本篇文章将详细探讨如何利用SurfaceView实现动画效果,...
在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...
在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们用于在屏幕上显示内容和处理用户交互。本文将详细解析View和SurfaceView的基本概念、用法以及它们之间的区别,通过实例代码来帮助理解。 **一、...
在安卓开发中,`SurfaceView` 是一个非常重要的视图组件,它允许开发者在应用程序中创建一个独立于窗口管理器的表面,这个表面可以用于显示持续更新的图像,如视频播放或者游戏画面。`SurfaceView` 提供了一个优化的...