android surfaceview 子线程绘图
时间: 2023-07-28 18:33:48 浏览: 192
在 Android 中,可以使用 SurfaceView 来进行子线程绘图,这样可以避免在主线程中执行绘图操作导致界面卡顿的情况发生。下面是一个简单的示例代码:
首先,在布局文件中添加 SurfaceView:
```xml
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
然后,在 Activity 中获取 SurfaceView 对象,并在其上创建一个子线程进行绘图:
```java
public class MyActivity extends Activity implements SurfaceHolder.Callback {
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private DrawThread mDrawThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 获取 SurfaceView 对象和 SurfaceHolder 对象
mSurfaceView = findViewById(R.id.surfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
// 设置 SurfaceHolder.Callback
mSurfaceHolder.addCallback(this);
// 创建子线程
mDrawThread = new DrawThread(mSurfaceHolder);
}
// SurfaceHolder.Callback 的实现
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 启动子线程
mDrawThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// do nothing
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止子线程
mDrawThread.stopDrawing();
}
// 子线程
private class DrawThread extends Thread {
private SurfaceHolder mSurfaceHolder;
private boolean mIsDrawing = true;
public DrawThread(SurfaceHolder surfaceHolder) {
mSurfaceHolder = surfaceHolder;
}
public void stopDrawing() {
mIsDrawing = false;
}
@Override
public void run() {
while (mIsDrawing) {
// 获取 Canvas 对象
Canvas canvas = mSurfaceHolder.lockCanvas();
if (canvas != null) {
// 在 Canvas 上进行绘图操作
// ...
// 解锁 Canvas
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
```
在子线程中,可以通过 SurfaceHolder 的 lockCanvas() 方法获取 Canvas 对象,然后在 Canvas 上进行绘图操作,最后通过 SurfaceHolder 的 unlockCanvasAndPost() 方法将 Canvas 解锁并提交到 SurfaceView 上进行显示。注意,要在子线程中不断地循环执行绘图操作,直到停止绘图的标志位被设置为 false。同时,在 SurfaceHolder.Callback 的实现中,需要在 surfaceCreated() 方法中启动子线程,在 surfaceDestroyed() 方法中停止子线程。
阅读全文