一、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/n/309443.html