我有一个自定义视图:
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()
,则会绘制每个视图。为什么?
答案 0 :(得分:1)
画布的坐标是相对于视图的,而不是其父视图的。当您将视图的x
和y
分别添加到返回值getCenterX()
和getCenterY()
中时,该图将图形推到视图的边界之外,从而使其显示为虽然什么也没画。要使它正常工作,只需删除那些附加项即可。