SurfaceView的标准写法

SurfaceView是通过子线程来更新显示的内容,很特别,所以总结了一套标准写法

public class TestSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

    SurfaceHolder mHolder;

    public TestSurfaceView(Context context) {
        super(context);
    }

    public TestSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {   //get Holder    ,监控回调
        mHolder = getHolder();
        mHolder.addCallback(this);
        //设置可以获取焦点
        setFocusable(true);
        setFocusableInTouchMode(true);
        //设置常亮
        setKeepScreenOn(true);

    }



    boolean isRunning = false;

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //在这里开启一个线程去绘制canvas
        isRunning = true;
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {    //当surfaceView被销毁时会调用
        isRunning = false;  //这里需要终端绘制逻辑
    }

    @Override
    public void run() {
        while (isRunning) {
            draw();
        }
    }

    //这个canvas是用来绘制内容的
    private Canvas canvas;

    private void draw() {
        try {   //这个try,catch是用来防止用户切换程序后,使得线程中继续有逻辑执行,而造成一些特殊的异常
            canvas = mHolder.lockCanvas();
            if (canvas == null) return;

                /*
                这里操作canvas,具体的显示逻辑
                 */

        } catch (Exception e) { //由于用户已经切换程序了,所以没必要处理异常了
            e.printStackTrace();
        } finally {  //最后解锁canvas
            if (canvas != null) mHolder.unlockCanvasAndPost(canvas);
        }

    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容