根据Goodle的官方文档表明,Surface中缓冲区个数是根据需求动态分配的,如果用户获取画布的频率较慢,那么将会分配两个缓冲区,否则,将分配3的倍数个缓冲区。总得来说,Surface分配的缓冲画布数量会大于便是2,具体多少须要视情况而定。
private fun drawCanvas() { Thread {for (i in 0..9) { val canvas = surfaceHolder.lockCanvas() Log.e("TAG", "drawCanvas: $i") canvas?.drawText("$i", i * 30f, 50f, paint) surfaceHolder.unlockCanvasAndPost(canvas) Thread.sleep(500) } } .start() }当我们将画布的获取频率低沉时,就可以看出每次缓冲区交换时绘制在屏幕上的内容。这里就可以很显着的看出,当画布的获取频率较慢时,体系只分配了两个画布。如下所示:
原理是搞清楚了,那么我们应该怎么把数字完备地绘制到画布上呢?着实很简朴,把每次绘制存在起来,下一次绘制时,把上一次的数字也绘制出来就可以了。
private val nums: MutableList<Int> = mutableListOf()private fun drawCanvas() { Thread {for (i in 0..9) { val canvas = surfaceHolder.lockCanvas() nums.add(i) for (num in nums) { canvas?.drawText("$num", num * 30f, 50f, paint) } surfaceHolder.unlockCanvasAndPost(canvas) Thread.sleep(500) } } .start()}
5.2.双缓冲局部更新原理