首先我们先了解一下SurfaceView与View的区别,什么场景使用SurfaceView。
1.基于View的绘图效率不高,主要用于动画变化较少的程序
2.SurfaceView 绘图效率较高,用于界面更新频繁的程序,如相机预览。
3.SurfaceView 可以在另一个线程中更新界面。

SurfaceView绘制的好处?
1.明明可以使用imageview显示图片、自定义View的ondraw()绘制一张图片,那是因为Android系统是每隔16ms发出VSYNC信号来进行屏幕的重绘,这个重绘是在主线程中的。一旦主线程中的绘制任务时长超过16ms,就会出现卡帧现象。
因为SurfaceView的屏幕绘制不是在主线程中,所以不会导致主线程(UI线程)的卡帧现象。而且底层实现了双缓冲机制,绘制效率高。
所以复杂耗时的绘制任务应该放到使用SurfaceView去绘制,效率高且不影响主线程绘制。比如游戏,视频渲染。

SurfaceView绘制实现:

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

        if (surfaceHolder == null) {
            return;
        }

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);

        Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "11.jpg");  // 获取bitmap
        Canvas canvas = surfaceHolder.lockCanvas();  // 先锁定当前surfaceView的画布
        canvas.drawBitmap(bitmap, 0, 0, paint); //执行绘制操作
        surfaceHolder.unlockCanvasAndPost(canvas); // 解除锁定并显示在界面上
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

    }
});
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐