音视频开发 ● Android使用SurfaceView绘制Bitmap
1.明明可以使用imageview显示图片、自定义View的ondraw()绘制一张图片,那是因为Android系统是每隔16ms发出VSYNC信号来进行屏幕的重绘,这个重绘是在主线程中的。一旦主线程中的绘制任务时长超过16ms,就会出现卡帧现象。因为SurfaceView的屏幕绘制不是在主线程中,所以不会导致主线程(UI线程)的卡帧现象。所以复杂耗时的绘制任务应该放到使用SurfaceView去
·
首先我们先了解一下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) {
}
});
更多推荐
所有评论(0)