在 onDraw 中已在 Canvas 上设置有问题的剪辑
Problematic clip already set on Canvas in onDraw
我将 TextView
子类化以提供自定义 onDraw。但是 canvas 应用了一个无意义的剪辑区域:x
被设置为远在视图边界之外的东西。我认为这阻碍了我的目的。
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// draw numberLabel
if (numberLabel == 0)
return
val right = this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)
// top needs to add the top margin and estimated text height
val top = this.resources.getDimension(R.dimen.topNavBadgeTopMargin) + this.badgePaint.textSize
canvas.drawText(numberLabel.toString(), right, top, this.badgePaint)
val r = Rect()
canvas.getClipBounds(r)
Log.d("TopNav", "canvas.clipBounds: $r")
}
Logcat 打印:
D/TopNav: canvas.clipBounds: Rect(524187, 0 - 524389, 147)
仅供参考,我也试过画一个圆 r=50 center=(100,100) 但它没有显示。那么有帮助的是 a) 为什么会发生这种情况? b) 我知道无法重置剪辑区域,但有什么解决方法可以帮助我吗?
似乎如果您在 TextView
中覆盖 onDraw
,您需要偏移 scrollX
(可能也应该做 scrollY
,尽管它是零)。 scrollX
是一个非常大的 int,我不知道为什么它在不需要滚动的 TextView 中会是非零值。
val right = this.scrollX + this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)
如果您有多个操作,那么 canvas.translate
由 save
和 restore
包装可能会有所帮助。
我将 TextView
子类化以提供自定义 onDraw。但是 canvas 应用了一个无意义的剪辑区域:x
被设置为远在视图边界之外的东西。我认为这阻碍了我的目的。
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// draw numberLabel
if (numberLabel == 0)
return
val right = this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)
// top needs to add the top margin and estimated text height
val top = this.resources.getDimension(R.dimen.topNavBadgeTopMargin) + this.badgePaint.textSize
canvas.drawText(numberLabel.toString(), right, top, this.badgePaint)
val r = Rect()
canvas.getClipBounds(r)
Log.d("TopNav", "canvas.clipBounds: $r")
}
Logcat 打印:
D/TopNav: canvas.clipBounds: Rect(524187, 0 - 524389, 147)
仅供参考,我也试过画一个圆 r=50 center=(100,100) 但它没有显示。那么有帮助的是 a) 为什么会发生这种情况? b) 我知道无法重置剪辑区域,但有什么解决方法可以帮助我吗?
似乎如果您在 TextView
中覆盖 onDraw
,您需要偏移 scrollX
(可能也应该做 scrollY
,尽管它是零)。 scrollX
是一个非常大的 int,我不知道为什么它在不需要滚动的 TextView 中会是非零值。
val right = this.scrollX + this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)
如果您有多个操作,那么 canvas.translate
由 save
和 restore
包装可能会有所帮助。