SurfaceView 事例
时间: 2023-08-16 20:36:57 浏览: 50
以下是一个简单的 SurfaceView 例子,演示如何在 SurfaceView 中绘制一个简单的图形。在这个例子中,我们将绘制一个红色的矩形,代码如下:
```
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private DrawThread drawThread;
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
holder = getHolder();
holder.addCallback(this);
drawThread = new DrawThread(holder);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawThread.setRunning(true);
drawThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
drawThread.setRunning(false);
while (retry) {
try {
drawThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
private static class DrawThread extends Thread {
private SurfaceHolder holder;
private boolean running;
public DrawThread(SurfaceHolder holder) {
this.holder = holder;
running = false;
}
public void setRunning(boolean running) {
this.running = running;
}
@Override
public void run() {
while (running) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setColor(Color.RED);
Rect rect = new Rect(100, 100, 200, 200);
canvas.drawRect(rect, paint);
}
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
}
}
}
```
在这个例子中,我们首先创建了一个 MySurfaceView 类,继承自 SurfaceView 类,并实现了 SurfaceHolder.Callback 接口。在 MySurfaceView 的构造方法中,我们获取了 SurfaceHolder 对象,并添加了一个回调接口,以便获取 SurfaceView 的绘制事件。同时,我们还创建了一个 DrawThread 线程对象,并将 SurfaceHolder 对象作为参数传递给它。
在 surfaceCreated() 回调方法中,我们启动了 DrawThread 线程,并将 running 标志设置为 true。在 DrawThread 线程的 run() 方法中,我们使用 Canvas 对象绘制了一个红色的矩形,并将其提交到 SurfaceHolder 上。
最后,在 surfaceDestroyed() 回调方法中,我们将 running 标志设置为 false,并等待 DrawThread 线程结束。这样,我们就成功地在 SurfaceView 中绘制了一个简单的图形。