canvas.draw<Figure> 仅为第一视图绘制

canvas.draw<Figure> draws only for first view

我有一个自定义视图:

    class StepView(
        context: Context?,

        @ColorInt
        color: Int,

        private val size: Float
    ) : View(context) {

        private val paint = Paint(Paint.ANTI_ALIAS_FLAG)

        init {
            paint.color = color
            setWillNotDraw(false)
        }

        fun setColor(@ColorInt color: Int) {
            paint.color = color
            invalidate()
        }

        private fun getCenterX() = x + width / 2

        private fun getCenterY() = y + height / 2

        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)

            canvas?.drawCircle(getCenterX(), getCenterY(), size / 2, paint)
        }
    }

它被另一个自定义视图(LinearLayout 的子类)使用:

    private fun init(stepCount: Int = defaultStepCount, currentStep: Int = defaultCurrentStep) {
        orientation = HORIZONTAL

        removeAllViews()

        for (i in 0 until stepCount) {
            createStepView(i)
        }
    }

    private fun createStepView(index: Int) {
        val stepView = StepView(context, arrayOf(Color.RED, Color.GREEN, Color.BLUE, Color.BLACK)[index], 20f)
        val layoutParams = LayoutParams(20, 20)

        addView(stepView, layoutParams)
    }

添加了所有视图,但 canvas?.drawCircle()(和其他方法,第 drawRect() 行)仅适用于第一个视图:

第二个和第三个在布局中但未绘制(边框来自 UiAutomatorViewer;调用了 onDraw 方法,我已检查日志和调试器)。

如果我调用 canvas?.drawColor(),它会绘制每个视图。为什么?

canvas 的坐标是相对于视图的,而不是它的父视图。当您将视图的 xy 分别添加到 getCenterX()getCenterY() 的 return 值中时,将图形推到视图的边界之外,使它看起来好像没有绘制任何东西。要让它工作,只需删除那些加数。