代码之家  ›  专栏  ›  技术社区  ›  artem

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

  •  0
  • artem  · 技术社区  · 6 年前

    我有一个自定义视图:

        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)
            }
        }
    

        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 回复  |  直到 6 年前
        1
  •  1
  •   greeble31    6 年前

    画布的坐标是相对于视图的,而不是相对于其父视图的。添加视图的 x y 转换为 getCenterX() getCenterY() ,将图形推到视图边界之外,使其看起来好像没有绘制任何东西。要让它工作,只需删除这些加数。