我将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)我知道无法重置剪辑区域,但是有什么解决方法对我有帮助吗?
答案 0 :(得分:0)
好像您在onDraw
中覆盖TextView
时,您需要偏移scrollX
(尽管应该为scrollY
,尽管它为零)。 scrollX
是一个非常大的整数,我不知道为什么在不需要滚动的TextView中它会为非零。
val right = this.scrollX + this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)
如果您有多个操作,那么canvas.translate
和save
包裹的restore
可能会有所帮助。