SurfaceView

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图帮助记忆:

SurfaceView_第1张图片

你可能感兴趣的:(SurfaceView)