Android 利用SurfaceView进行图形绘制
时间: 2023-09-02 21:14:49 浏览: 100
在android中surfaceView的使用
5星 · 资源好评率100%
在 Android 中,可以使用 SurfaceView 进行图形绘制,SurfaceView 继承自 View 类,但是与普通的 View 不同,它可以在新的线程中进行绘制操作,因此可以避免在主线程中进行图形绘制导致的卡顿现象。
下面是基本的 SurfaceView 实现流程:
1. 创建一个 SurfaceView 对象,并将其添加到布局中。
2. 实现 SurfaceHolder.Callback 接口,该接口包括三个方法:surfaceCreated、surfaceDestroyed、surfaceChanged。
3. 在 surfaceCreated 回调方法中获取 SurfaceHolder 对象,并通过该对象获取 Canvas 对象进行图形绘制。
4. 在 surfaceChanged 回调方法中实现屏幕旋转、大小变化等操作。
5. 在 surfaceDestroyed 回调方法中释放资源,停止绘制线程等操作。
下面是一个简单的 SurfaceView 实现示例:
```java
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Paint mPaint;
private Thread mThread;
private boolean mRunning;
public MySurfaceView(Context context) {
super(context);
init();
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mRunning = true;
mThread = new Thread(new Runnable() {
@Override
public void run() {
while (mRunning) {
draw();
}
}
});
mThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mRunning = false;
try {
mThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void draw() {
Canvas canvas = mHolder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
mHolder.unlockCanvasAndPost(canvas);
}
}
}
```
在该示例中,我们在 surfaceCreated 回调方法中启动了一个新的线程进行图形绘制,每次循环都会调用 draw 方法,该方法中获取 Canvas 对象进行绘制,最后通过 unlockCanvasAndPost 方法提交绘制结果。在 surfaceDestroyed 回调方法中停止绘制线程,释放资源。
阅读全文