01 Android 植物人大战僵尸-画个方块
1. SurfaceView
更新的速度特別快,可以直接從內(nèi)存或者DMA等硬件接口中取得圖像數(shù)據(jù)的繪圖容器
可以在主線程之外的線程中向屏幕繪圖上,可以避免繪圖任務(wù)繁重導(dǎo)致主線程阻塞,從而提高程序的反應(yīng)速度。在游戲開發(fā)中多用到SurfaceView,游戲中的背景、人物、動畫等盡量在canvas繪制
2.SurfaceView 與View 的區(qū)別
SurfaceView 是在一個新的起的線程中繪制畫面,而View必須在UI中繪制更新畫面。可以理解為SurfaceView的更新不需要在主線程中進行,這樣就可以避免主線程來做大量的界面更新操作,引起ANR(主線程的界面更新的消息隊列中存在大量的更新界面請求)
實際開發(fā)中,高級UI和低級UI并用
3.SurfaceView的使用
所有繪圖工作必須在Surface被創(chuàng)建之后才能愛上,而在Surface被銷毀之前必須結(jié)束,所以Callback中的SurfaceCreated和SurfaceDestroyer就成了繪圖處理代碼的邊界
Surface是顯卡內(nèi)存的映射
public class GameView extends SurfaceView implements SurfaceHolder.Callback, Runnable {SurfaceHolder 為surfaceView的控制器,用來操縱surface。處理他的Canvas上畫的效果和動畫,控制表面,大小,像素
注意點:
- 2.1 abstact void addCallback(SurfaceHolder.Callback callBack)
給SurfaceView 當前持有者一個回調(diào)事件,通過這個建立紐帶
- 2.2 abstractCanvas lockCanvas()
鎖定畫布,一般鎖定后就可以通過其返回的畫布對象Canvase,在其上面畫圖等操作
- 2.3 abstract Canvas lockCanvas(Rect dirty)
鎖定畫布的某個區(qū)域進行畫圖等,因為畫完圖后,會調(diào)用下面的unlockCanvasAndPost來改變顯示內(nèi)容
相對部分內(nèi)存要求比較高的游戲來說,可以不用重畫dirty外的其他區(qū)域的像素,可以提高速度
- 2.4 abstract void unlockCanvasAndPost(Canvas canvas)
結(jié)束鎖定畫圖,并提交改變
4.SurfaceView的生命周期
在SurfaceView的派生類中,使用geHolder方法來獲取SurfaceHolder對象,向addCallBack來添加回調(diào)函數(shù)
surfaceChanged:在surfaceView的大小發(fā)生改變的時候回調(diào)
surfaceCreated:在創(chuàng)建Surface時回調(diào)
surfaceDestroyed:在銷毀Surface時激發(fā)
5.畫一個方塊
package com.su.botanywarzombies;import com.su.botanywarzombies.view.GameView;import android.app.Activity; import android.os.Bundle;public class MainActivity extends Activity {private GameView mGameView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGameView = new GameView(this);setContentView(mGameView);}}GameView 的基本使用方法
package com.su.botanywarzombies.view;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView;public class GameView extends SurfaceView implements SurfaceHolder.Callback, Runnable {public static final String TAG = GameView.class.getSimpleName();private boolean gameRunFlag;// 繪圖畫筆private Paint mPaint;// 繪圖畫布private Canvas mCanvas;private SurfaceHolder mSurfaceHolder;public GameView(Context context) {super(context);gameRunFlag = true;mPaint = new Paint();mSurfaceHolder = getHolder();// 設(shè)置操作回調(diào)事件mSurfaceHolder.addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {Log.d(TAG, "surfaceCreated");new Thread(this).start();}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {Log.d(TAG, "surfaceDestroyed");gameRunFlag = false;}@Overridepublic void run() {while (gameRunFlag) {// 這里需要考慮線程同步synchronized (mSurfaceHolder) {try {// 鎖住畫布才能繪圖mCanvas = mSurfaceHolder.lockCanvas();int color = mPaint.getColor();mPaint.setColor(Color.RED);mCanvas.drawRect(50, 50, 100, 100, mPaint);// 好習(xí)慣畫筆復(fù)位mPaint.setColor(color);} catch (Exception e) {e.printStackTrace();} finally {// 解鎖并提交mSurfaceHolder.unlockCanvasAndPost(mCanvas);}try {// 視頻達到24幀,1秒24幀圖片,肉眼是感受不到變化Thread.sleep(60);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }總結(jié)
以上是生活随笔為你收集整理的01 Android 植物人大战僵尸-画个方块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于艾宾浩斯遗忘曲线的APP(大学毕业设
- 下一篇: 给你的web页面添加盲水印,附带检盲水印