SurfaceView在surfaceCreated上,但是绘制到Canvas直到很久以后才显示任何内容

时间:2018-07-24 05:31:41

标签: android canvas surfaceview

我有一个SurfaceView如下

class CanvasDrawView : SurfaceView, SurfaceHolder.Callback {

    @JvmOverloads
    constructor(
            context: Context,
            attrs: AttributeSet? = null,
            defStyleAttr: Int = 0)
            : super(context, attrs, defStyleAttr)

    init {
        holder.addCallback(this)
    }

    private val strokePaint = Paint()
            .apply { color = Color.RED }
            .apply { strokeWidth = 16f }

    private var job: Job? = null
    override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
        // Do nothing for now
    }

    override fun surfaceDestroyed(holder: SurfaceHolder?) {
        job?.cancel()
    }

    override fun surfaceCreated(holder: SurfaceHolder?) {

        var i = 0f
        job = launch {
            while (true) {
                val canvas = holder?.lockCanvas(null)
                synchronized(holder!!) {
                    i += 1f
                    if (i > width) {
                        i = 0f
                    }
                    canvas?.drawPoint(i, i, strokePaint)
                }

                holder?.unlockCanvasAndPost(canvas)
            }
        }
    }
}

它开始从点0、0开始绘制并进行动画处理。

但是,按照以下所示的gif效果,直到3秒钟后才在屏幕上显示(显示或应用)画布上的图形(其中仅显示较晚的绘制点,而不显示较早的点)。

直到3秒显示画布后,画布才会更新。

enter image description here

我的问题是,

1。)导致延迟的原因(在Canvas绘图无效的情况下)?

2。)如何检测何时可以显示Canvas绘图(以便可以从此处开始绘图)?

0 个答案:

没有答案