Android之View和SurfaceView

Android游戏当中主要的除了控制类外就是显示类View。SurfaceView是从View基类中派生出来

的显示类。android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。
  View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI

主线程内更新画面,速度较慢。

  SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,

类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。

  GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图

;是SurfaceView的子类,openGL专用。

  

  在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。 View和

SurfaceView区别:

   View:必须在UI的主线程中更新画面,用于被动更新画面。

  surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更

新画面。


     UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线

程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
 当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来

了另外一个问题,就是事件同步,涉及到线程同步。

 

所以基于以上,根据游戏特点,一般分成两类。

1 被动更新画面。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更

新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间

比较长些,不会产生影响。

2 主动更新画面。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免

阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。

下面是使用sufaceView一个基本的框架:
我们可以在onDraw方法中更新UI(被动更新画面)也可以在Paint函数中更新UI(主动更新画面)

[java]  view plain copy
  1. package com.example.viewtest;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.os.Bundle;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11.   
  12. public class MainActivity extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(new MyView(this));  
  18.     }  
  19.   
  20.     class MyView extends SurfaceView implements SurfaceHolder.Callback,  
  21.             Runnable {  
  22.         SurfaceHolder holder = null;  
  23.         Paint paint;  
  24.   
  25.         public MyView(Context context) {  
  26.             super(context);  
  27.             // TODO Auto-generated constructor stub  
  28.             holder = getHolder();  
  29.             holder.addCallback(this);  
  30.             paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  31.             paint.setColor(Color.RED);  
  32.   
  33.             this.setFocusable(true);  
  34.         }  
  35.   
  36.         @Override  
  37.         public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  38.                 int height) {  
  39.             // TODO Auto-generated method stub  
  40.   
  41.         }  
  42.   
  43.         @Override  
  44.         public void surfaceCreated(SurfaceHolder holder) {  
  45.             // TODO Auto-generated method stub  
  46.             Thread t = new Thread(this);  
  47.             t.start();  
  48.         }  
  49.   
  50.         @Override  
  51.         public void surfaceDestroyed(SurfaceHolder holder) {  
  52.             // TODO Auto-generated method stub  
  53.             isRunning = false;  
  54.         }  
  55.   
  56. /*      @Override 
  57.         protected void onDraw(Canvas canvas) { 
  58.             // TODO Auto-generated method stub 
  59.             canvas = holder.lockCanvas(); 
  60.             // 刷屏 
  61.             canvas.drawColor(Color.BLACK); 
  62.  
  63.             canvas.drawCircle(x, y, 10, paint); 
  64.  
  65.             holder.unlockCanvasAndPost(canvas); 
  66.         }*/  
  67.   
  68.         private void paint(Paint paint) {  
  69.             Canvas canvas = holder.lockCanvas();  
  70.             // 刷屏  
  71.             canvas.drawColor(Color.BLACK);  
  72.   
  73.             canvas.drawCircle(x, y, 10, paint);  
  74.   
  75.             holder.unlockCanvasAndPost(canvas);  
  76.         }  
  77.   
  78.         boolean isRunning = true;  
  79.   
  80.         @Override  
  81.         public void run() {  
  82.             // TODO Auto-generated method stub  
  83.             while (isRunning) {  
  84.             //  onDraw(null);  
  85.                 paint(paint);  
  86.                 move();  
  87.                 try {  
  88.                     Thread.sleep(50);  
  89.                 } catch (InterruptedException e) {  
  90.                     // TODO Auto-generated catch block  
  91.                     e.printStackTrace();  
  92.                 }  
  93.   
  94.             }  
  95.         }  
  96.   
  97.         private int x, y;  
  98.   
  99.         private void move() {  
  100.             x += 2;  
  101.             y += 2;  
  102.         }  
  103.     }  
  104.   
  105. }  

你可能感兴趣的:(Android之View和SurfaceView)