Android SurfaceView


SurfaceView

Surface相當於繪制的容器,所有View和子類都是繪制在這里面。

SurfaceView是View的子類,將Surface的數據顯示出來。

View適用主動更新視圖,不需要頻繁刷新。在主線程更新UI,沒有雙緩沖機制。

SurfaceView適用於被動更新視圖,頻繁刷新。通過子線程更新UI,底層實現中就實現了雙緩沖機制。

SurfaceHolder

SurfaceHolder是Surface的抽象接口,操縱surface的控制器。

使用SurfaceView的getHolder()方法,獲取SurfaceHolder對象

在SurfaceView使用中需要的幾個重要方法:

void addCallback(SurfaceHolder.Callback var1);
//為SurfaceHolder添加一個SurfaceHolder.Callback回調接口

void removeCallback(SurfaceHolder.Callback var1);
//從Surface持有者中刪除回調接口

Canvas lockCanvas();
//獲取Canvas對象,並鎖定

void unlockCanvasAndPost(Canvas var1);
//釋放同步鎖,並顯示

void setFormat(int var1);
//指定surface的像素格式,PixelFormat常量

void setFixedSize(int var1, int var2);
//固定Surface的寬高

void setKeepScreenOn(boolean var1);
//false是允許屏幕關閉,true強制屏幕打開狀態

SurfaceHolder.Callback

實現SurfaceHolder.Callback接口,創建SurfaceView的生命周期,它有三個回調方法:

@Override
public void surfaceCreated(SurfaceHolder holder) {
    //Surface創建的時候調用
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
       //Surface大小被改變的時候調用
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    //Surface被銷毀的時候調用
}    

實現Runnable接口,利用子線程做繪圖操作

繪制方法需要在繪制前調用locakCanvas鎖定畫布,得到畫布。

繪制完成后需要調用lockCanvasAndPost方法來解鎖畫布,顯示。

 @Override
 public void run() {
       draw();
 }

private void draw() {
   try {
      mCanvas=mHolder.lockCanvas();
          //繪制

      }catch (Exception e){

      }finally {
            //避免黑屏情況,解鎖畫布
          if(mCanvas!=null){
            mHolder.unlockCanvasAndPost(mCanvas);
         }
     }
}

 相關閱讀

SurfaceView開啟相機預覽

SurfaceView實現跟隨手指移動的光標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM