Canvas.drawRect在设置gravity后无法在TextView的onDraw中工作

5

我有一个自定义视图继承自 TextView,在 onDraw() 中编写了一些代码:

@Override
protected void onDraw(Canvas canvas) {
    if (mTextShader == null) {
        createShader();
    }
    shaderMatrix.setTranslate(mProgressWidth,0);
    mTextShader.setLocalMatrix(shaderMatrix);

    Paint paint = new Paint();
    paint.setShader(mBgShader);
    canvas.drawRect(0,0,mProgressWidth,getBottom(),paint);
    getPaint().setShader(mTextShader);
    super.onDraw(canvas);
}

看起来是这样的:在此输入图片描述。只需要设置一些着色器,画一个矩形,如果我不使用

就可以正常工作。
android:gravity="center"

并且

android:singleLine="true"

在一起使用时(只用其中一个已经很好了),如果仅使用这个属性,这些着色器和矩形将会消失!

为什么会这样?


3
因为您的 Canvas 被翻译了。 - pskink
请将您的Canvas转回或更改Rect中的点。 - pskink
我不明白,你能简单明了地解释一下吗? - RainFool
3
画布被getScrollX()像素进行了平移,这就是为什么你看不到矩形的原因。 - pskink
3
请查看此处以获取一些可运行的代码。 - pskink
显示剩余2条评论
2个回答

4
在绘制画布之前,需要翻译滚动的 XY 距离。
canvas.translate(getScrollX(), getScrollY());
canvas.drawRect(0,0, getWidth(), getHeight(), borderPaint);

0

你的 super.onDraw(canvas) 应该在第一行,否则父类会在你的绘图上方进行绘制。此外,在你的构造函数中调用 setWillNotDraw(false)。


我猜TextView的super.onDraw(canvas)会在我画完矩形后再绘制文本,所以我把它放在最后。 - RainFool
你检查过它在绘制之前是否只绘制文本或清空画布吗? - user642700

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接