因为视频的渲染,本质上就是显示一张一张的图片,因此学习第一步就是学习显示图片。git
此次咱们使用三种不一样的方式来显示一张图片。github
使用 ImageView 是最简单也是最经常使用的方式了。canvas
context?.let { image.setImageBitmap(decodeStream(it.assets.open("images/test_image.jpeg"))) } 复制代码
咱们知道View是经过刷新来重绘视图,系统经过发出
VSSYNC
信号来进行屏幕的重绘,刷新的时间间隔是 16 ms,若是咱们能够在 16 ms 之内将绘制工做完成,则没有任何问题,若是咱们绘制过程逻辑很复杂,并且咱们的界面更新还很是频繁,这时候就会形成界面的卡顿,影响用户体验。为此Android提供了SurfaceView
来解决这一问题。微信
最后确定要上代码的 [狗头]markdown
surfaceView.holder.addCallback(object : SurfaceHolder.Callback { override fun surfaceCreated(holder: SurfaceHolder?) { holder?.let { Thread { val canvas = it.lockCanvas() val bitmap = decodeStream(context?.assets?.open("images/test_image.jpeg")) val bitmapW = bitmap.width val bitmapH = bitmap.height val src = Rect(0, 0, bitmapW, bitmapH) val dst = if (bitmapW > bitmapH) { Rect( 0, 0, surfaceView.width, (surfaceView.width * (bitmapH.toFloat() / bitmapW)).toInt() ) } else { Rect( 0, 0, surfaceView.height * (bitmapW / bitmapH), surfaceView.height ) } canvas.drawColor(Color.parseColor("#ffffff")) canvas.drawBitmap( bitmap, src, dst, Paint() ) it.unlockCanvasAndPost(canvas) }.start() } } override fun surfaceChanged( holder: SurfaceHolder?, format: Int, width: Int, height: Int ) { } override fun surfaceDestroyed(holder: SurfaceHolder?) { } }) 复制代码
其实自定义 View 和 SurfaceView 差很少,直接看代码:ide
class CustomImageView : View { constructor(context: Context?) : super(context) {} constructor(context: Context?, attrs: AttributeSet?) : super( context, attrs ) constructor( context: Context?, attrs: AttributeSet?, defStyleAttr: Int ) : super(context, attrs, defStyleAttr) constructor( context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : super(context, attrs, defStyleAttr, defStyleRes) private val bitmap: Bitmap = BitmapFactory.decodeStream(context?.assets?.open("images/test_image.jpeg")) private val src = Rect() private val dst = Rect() private val paint = Paint() override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) val bitmapW = bitmap.width val bitmapH = bitmap.height src.set(0, 0, bitmapW, bitmapH) if (bitmapW > bitmapH) { dst.set( 0, 0, this.width, (this.width * (bitmapH.toFloat() / bitmapW)).toInt() ) } else { dst.set( 0, 0, this.height * (bitmapW / bitmapH), this.height ) } canvas?.drawBitmap(bitmap, src, dst, paint) } } 复制代码
OK,第一个任务算是完成了~代码更新在 GitHub 仓库中。新年新气象,下个任务见~oop