在 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.translatesaverestore 包装可能会有所帮助。