android surfaceview 技术,Android中SurfaceView的理解和使用
时间: 2024-02-17 20:01:08 浏览: 151
在android中surfaceView的使用
5星 · 资源好评率100%
Android中的SurfaceView是一个可以在自己的线程中绘制UI的控件,通常用于实现游戏、视频播放等需要高性能绘制的场景。相较于普通的View,SurfaceView的绘制是在一个独立的缓冲区中进行的,这个缓冲区可以在后台线程中进行绘制,然后在主线程中进行显示,这样可以确保UI的流畅性和性能。
使用SurfaceView的步骤如下:
1.定义SurfaceView
在布局文件中定义SurfaceView,例如:
```
<android.view.SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
2.获取SurfaceHolder
在Activity或者Fragment中获取SurfaceView的SurfaceHolder对象,用于控制SurfaceView的绘制:
```
SurfaceView surfaceView = findViewById(R.id.surface_view);
SurfaceHolder holder = surfaceView.getHolder();
```
3.实现SurfaceHolder.Callback接口
实现SurfaceHolder.Callback接口,它包含三个方法:surfaceCreated、surfaceChanged和surfaceDestroyed。其中,surfaceCreated在SurfaceView创建时调用,surfaceChanged在SurfaceView绘制区域大小发生变化时调用,surfaceDestroyed在SurfaceView销毁时调用。在这些方法中,我们可以进行SurfaceView的初始化、绘制、销毁等操作。
```
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 初始化SurfaceView
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// SurfaceView绘制区域大小发生变化
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 销毁SurfaceView
}
});
```
4.在后台线程中进行绘制
在surfaceCreated方法中,我们可以启动一个后台线程,用于进行SurfaceView的绘制。在这个线程中,我们可以使用Canvas对象进行绘制。在绘制完成后,我们需要调用SurfaceHolder的lockCanvas方法获取到Canvas对象,然后进行绘制,最后调用SurfaceHolder的unlockCanvasAndPost方法提交绘制结果。
```
Thread drawThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
Canvas canvas = holder.lockCanvas();
// 绘制操作
holder.unlockCanvasAndPost(canvas);
}
}
});
drawThread.start();
```
5.在主线程中更新UI
在surfaceChanged和surfaceDestroyed方法中,我们需要在主线程中更新UI,例如修改控件的可见性、修改控件的属性等操作。可以使用runOnUiThread方法或者Handler来实现。
```
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在主线程中更新UI
}
});
```
阅读全文