在onDraw的Canvas上已经设置了有问题的剪辑

时间:2018-10-22 21:18:40

标签: android android-canvas android-view textview

我将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)我知道无法重置剪辑区域,但是有什么解决方法对我有帮助吗?

1 个答案:

答案 0 :(得分:0)

好像您在onDraw中覆盖TextView时,您需要偏移scrollX(尽管应该为scrollY,尽管它为零)。 scrollX是一个非常大的整数,我不知道为什么在不需要滚动的TextView中它会为非零。

    val right = this.scrollX + this.width - this.resources.getDimension(R.dimen.topNavBadgeEndMargin)

如果您有多个操作,那么canvas.translatesave包裹的restore可能会有所帮助。