canvas.draw <figure>仅用于第一视图绘制

时间:2018-11-03 20:43:32

标签: android kotlin android-custom-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())仅适用于第一个视图:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

画布的坐标是相对于视图的,而不是其父视图的。当您将视图的xy分别添加到返回值getCenterX()getCenterY()中时,该图将图形推到视图的边界之外,从而使其显示为虽然什么也没画。要使它正常工作,只需删除那些附加项即可。