日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

01 Android 植物人大战僵尸-画个方块

發布時間:2023/12/20 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01 Android 植物人大战僵尸-画个方块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. SurfaceView

更新的速度特別快,可以直接從內存或者DMA等硬件接口中取得圖像數據的繪圖容器

可以在主線程之外的線程中向屏幕繪圖上,可以避免繪圖任務繁重導致主線程阻塞,從而提高程序的反應速度。在游戲開發中多用到SurfaceView,游戲中的背景、人物、動畫等盡量在canvas繪制

2.SurfaceView 與View 的區別

SurfaceView 是在一個新的起的線程中繪制畫面,而View必須在UI中繪制更新畫面。可以理解為SurfaceView的更新不需要在主線程中進行,這樣就可以避免主線程來做大量的界面更新操作,引起ANR(主線程的界面更新的消息隊列中存在大量的更新界面請求)

實際開發中,高級UI和低級UI并用

3.SurfaceView的使用

  • 繼承SurfaceView并實現SurfaceHolder.Callback接口
  • 所有繪圖工作必須在Surface被創建之后才能愛上,而在Surface被銷毀之前必須結束,所以Callback中的SurfaceCreated和SurfaceDestroyer就成了繪圖處理代碼的邊界

    Surface是顯卡內存的映射

    public class GameView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
  • SurfaceHolder
  • SurfaceHolder 為surfaceView的控制器,用來操縱surface。處理他的Canvas上畫的效果和動畫,控制表面,大小,像素

    注意點:
    - 2.1 abstact void addCallback(SurfaceHolder.Callback callBack)
    給SurfaceView 當前持有者一個回調事件,通過這個建立紐帶

    mSurfaceHolder = getHolder(); // 設置操作回調事件 mSurfaceHolder.addCallback(this);
    • 2.2 abstractCanvas lockCanvas()
      鎖定畫布,一般鎖定后就可以通過其返回的畫布對象Canvase,在其上面畫圖等操作
    // 鎖住畫布才能繪圖 mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawRect(50, 50, 100, 100, mPaint);
    • 2.3 abstract Canvas lockCanvas(Rect dirty)
      鎖定畫布的某個區域進行畫圖等,因為畫完圖后,會調用下面的unlockCanvasAndPost來改變顯示內容

    相對部分內存要求比較高的游戲來說,可以不用重畫dirty外的其他區域的像素,可以提高速度

    • 2.4 abstract void unlockCanvasAndPost(Canvas canvas)
      結束鎖定畫圖,并提交改變
    // 解鎖并提交 mSurfaceHolder.unlockCanvasAndPost(mCanvas);

    4.SurfaceView的生命周期

    在SurfaceView的派生類中,使用geHolder方法來獲取SurfaceHolder對象,向addCallBack來添加回調函數

    surfaceChanged:在surfaceView的大小發生改變的時候回調

    surfaceCreated:在創建Surface時回調

    surfaceDestroyed:在銷毀Surface時激發

    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();// 設置操作回調事件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);// 好習慣畫筆復位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();}}}} }

    總結

    以上是生活随笔為你收集整理的01 Android 植物人大战僵尸-画个方块的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。