SurfaceView 代码案例
时间: 2023-07-09 16:35:13 浏览: 45
好的,以下是一个简单的 SurfaceView 代码案例:
```java
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private MyThread thread;
public MySurfaceView(Context context) {
super(context);
getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread = new MyThread(holder);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// do nothing
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while (retry) {
try {
thread.setRunning(false);
thread.join();
retry = false;
} catch (InterruptedException e) {
// do nothing
}
}
}
private static class MyThread extends Thread {
private final SurfaceHolder surfaceHolder;
private boolean isRunning = true;
public MyThread(SurfaceHolder surfaceHolder) {
this.surfaceHolder = surfaceHolder;
}
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
@Override
public void run() {
Canvas canvas;
while (isRunning) {
canvas = null;
try {
canvas = surfaceHolder.lockCanvas(null);
if (canvas != null) {
// draw something on canvas
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
}
```
在这个案例中,我们创建了一个自定义的 SurfaceView,并实现了 SurfaceHolder.Callback 接口。在 surfaceCreated() 回调中创建了一个新的线程,并在其中不断地在 SurfaceView 上绘制内容。在 surfaceDestroyed() 回调中停止线程的运行。这个例子还可以进一步优化,例如使用双缓冲来避免闪烁等问题。