如何“设置”一个油漆来完成上面的“第二个”图像?
paint.setColor(Color.BLACK);
canvas.drawText(strValue, x, y, paint);
第一张图片:由于上面的代码,文本全部为黑色。
第二张图片:更好地对比背景颜色(用图形编辑器编辑,只是为了在这里说明)
请注意,“31”是部分黑色和部分白色(但它可以是与红色对比度更好的任何其他颜色,因为“36”可能是蓝色)。
您可以使用PixelXorXfermode进行绘制。
我能想到的唯一解决方案是,首先在你的 onDraw 上,你有一个变量 Canvas ,你等于实际的,然后你画你的数字,
paint.setColor(Color.BLACK);
canvas.drawText(strValue, x, y, paint);
然后你画红色的 Rect
canvas.drawRect(myRect, redPaint);
然后你画你的线
canvas.drawline(mStartX,mStartY, mFinishX, mFinishY, myLinePaint);
在你的 onDraw 之外的最后,你调用一个像这样的方法:
public void myMethod(){
Paint paint = new Paint();
paint.setColor(Color.BLACK);
this.canvas.drawText(strValue, x, y, paint);
//here you will define the area that you will mark as dirty
//(wich can have the same values as your red Rect)
Rect myRect = new Rect();
myRect.set(x0,y0,x1,y1);
//and finally here you invalidate ONLY the red area
this.canvas.invalidate(myRect);
}
注意:这将要求在您的 onDraw 上验证全局 Canvas 不为空,如果是,则将您的全局等同于实际值。我不确定这是否真的有效,但这是我能想到的唯一解决方案。
设置 AntiAlias 时,PixelXorXfermode 不是好方法。
如果你能得到红色矩形,我认为使用 canvas.clipRect 更好。像这样
textpaint.setColor(black);
canvas.drawText(str,x,y,textpaint);
Rect oldClipRect = canvas.getClipBounds();
canvas.clipRect(rcRed,Op.REPLACE);
textpaint.setColor(white);
canvas.drawText(str,x,y,textpaint);
canvas.clipRect(oldclipRect,Op.REPLACE);