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 的坐标是相对于视图的,而不是它的父视图。当您将视图的 x
和 y
分别添加到 getCenterX()
和 getCenterY()
的 return 值中时,将图形推到视图的边界之外,使它看起来好像没有绘制任何东西。要让它工作,只需删除那些加数。
我有一个自定义视图:
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 的坐标是相对于视图的,而不是它的父视图。当您将视图的 x
和 y
分别添加到 getCenterX()
和 getCenterY()
的 return 值中时,将图形推到视图的边界之外,使它看起来好像没有绘制任何东西。要让它工作,只需删除那些加数。