一、SurfaceHolder的作用
SurfaceHolder是SurfaceView的內部類,它是用來管理Surface的一個介面。在SurfaceView中通過SurfaceHolder來控制Surface的創建、銷毀,以及加鎖、解鎖畫布等操作,使得我們可以在Surface上面進行繪製、播放視頻等操作。
二、SurfaceHolder.callback
在SurfaceHolder的生命周期中,我們可以通過SurfaceHolder.callback介面來監聽Surface的狀態變化。其中包含了三個方法:
// Surface創建回調
public void surfaceCreated(SurfaceHolder holder) {}
// Surface大小變化回調
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
// Surface銷毀回調
public void surfaceDestroyed(SurfaceHolder holder) {}
當Surface創建、大小變化或銷毀時,系統會調用以上三個方法中對應的方法,開發者可以在這些方法中進行相應的操作。
三、SurfaceHolder獲取SurfaceView
SurfaceHolder可以通過SurfaceView的getHolder()方法進行獲取:
SurfaceView surfaceView = findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
通過上面的代碼我們就可以獲取到SurfaceHolder對象了。
四、SurfaceHolder是什麼
SurfaceHolder實際上是個連接SurfaceView和Surface的橋樑,它封裝了Surface的訪問和管理,使得SurfaceView可以直接操作Surface,而無需開發者直接去操作Surface。
五、SurfaceHolder原理
SurfaceHolder原理比較簡單,它內部持有一個Surface對象,通過Surface的lockCanvas()方法獲取Canvas對象,然後就可以進行繪製操作了。當繪製完成後,需要通過Surface的unlockCanvasAndPost(canvas)方法將畫布解鎖並提交。
// 獲取Canvas
Canvas canvas = surfaceHolder.lockCanvas();
// 繪製操作
...
// 解鎖Canvas
surfaceHolder.unlockCanvasAndPost(canvas);
六、代碼示例
以下是一個簡單的示例代碼:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSurfaceView = findViewById(R.id.surfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Surface創建成功,可以在此處進行繪製操作
Canvas canvas = holder.lockCanvas();
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(200, 200, 100, paint);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Surface大小變化回調
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface銷毀回調
}
}
上述代碼中,我們在surfaceCreated()方法中獲取Canvas對象,並繪製了一個紅色的圓形,然後通過surfaceHolder.unlockCanvasAndPost(canvas)方法將畫布解鎖,並提交到Surface上面。在手機屏幕上面就可以看到一個紅色的圓形了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/309443.html