Android:具有背景对比度的DrawText

时间:2012-04-24 22:21:09

标签: android graphics canvas drawtext contrast

如何“设置”油漆以完成上面的“第二”图像?

paint.setColor(Color.BLACK);
canvas.drawText(strValue, x, y, paint);

enter image description here

第一张图片:由于上述代码的结果,所有文字均为黑色。

第二张图片:更好的背景颜色(用图形编辑器编辑,仅用于说明)

请注意,“31”部分为黑色且部分为白色(但可能是任何其他颜色与红色形成鲜明对比,因为“36”可能为蓝色)。

3 个答案:

答案 0 :(得分:4)

您可以使用PixelXorXfermode进行绘制。

答案 1 :(得分:1)

我能想到的唯一解决方案是,首先在onDraw上你有一个变量Canvas,它等于实际的那个,然后你绘制你的数字,

paint.setColor(Color.BLACK);
canvas.drawText(strValue, x, y, paint);

然后你绘制红色矩形

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不为null 如果是这样,那么你将全局与实际相等。 我不确定这是否真的有效,但是我能想到的唯一解决方案。

答案 2 :(得分:0)

设置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);