SurfaceView可以说是View的孪生兄弟,但它与View还是有所不同的,它们的区别主要体现如下:
- View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新,例如频繁地刷新。
- View在主线程中对画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面的刷新。
- View在绘图时没有使用双缓冲机制,而SurfaceView在底层实现机制中就已经实现了双缓冲机制。
总结成一句话就是如果你的自定义View需要频繁刷新,或者刷新时数据处理量比较大,那么你就可以考虑使用SurfaceView来取代View了。
模板代码如下:
public class MyZiDingYiView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private SurfaceHolder surfaceHolder;
private Canvas canvas;
private boolean isDrawing;
private Paint paint;
public MyZiDingYiView(Context context) {
super(context);
init();
}
public MyZiDingYiView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyZiDingYiView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
paint=new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.GREEN);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isDrawing = true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isDrawing = false;
}
@Override
public void run() {
while (isDrawing) {
draw();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void draw() {
canvas = surfaceHolder.lockCanvas();//获取画布,如果不是第一次获取画布,那么获取到的就是上次的Canvas对象,之前的绘图操作都将被保留,如果需要擦除,则可以在绘制前,通过Canvas.drawColor()方法来进行清屏操作。
/*绘制你的图形*/
surfaceHolder.unlockCanvasAndPost(canvas);//保存画布
}
}
最后来张自制的UML图帮助记忆:
网友评论