AvoidXferMode Tolerance

时间:2010-03-31 14:19:54

标签: android android-sdk-2.1

我遇到以下代码的问题:

protected void onDraw(Canvas canvas)
{
    Paint paint = new Paint();

    // Draw a blue circle
    paint.setColor(Color.BLUE);
    canvas.drawCircle(100, 100, 50, paint);

    // Draw a red circle where it collides with the blue one
    paint.setXfermode(new AvoidXfermode(Color.BLUE, 0, Mode.TARGET));
    paint.setColor(Color.RED);
    canvas.drawCircle(50, 50, 50, paint);
}

根据AvoidXfermode的API文档,容差值0表示它寻找精确的颜色匹配。这应该在这里工作,因为我指定的颜色与绘制第一个圆圈的颜色相同。但结果是根本没有画出红色圆圈。当我使用公差值255而不是它工作时(红色圆圈被绘制在它与蓝色圆圈碰撞的地方)但听起来不对,因为如此高的公差我认为它应该在任何地方绘制圆圈。

那么这里有什么问题? API文档? Android的?我吗?

1 个答案:

答案 0 :(得分:3)

你的画布位深度是RGB_565还是ARGB_8888?我在两种格式上测试了这个。它在32位画布上工作,但在16位画布上不起作用。 16位图像可能无法显示您正在绘制的确切颜色(0xFF0000FF),因此当您绘制第一个蓝色圆圈时,它会稍微改变(在人眼不知不觉中)。然后,当你执行避免时,以零容差为目标准确的蓝色,没有显示任何内容,因为真正的蓝色不在图像中。

容差为255的工作原理是因为它允许避免匹配“几乎是蓝色”的颜色,结果将是一个“几乎是红色”的圆圈。如果使用高容差的公差,请尝试非常低的公差(从1开始向上),直到找到一个小但仍匹配您想要替换的“几乎蓝”的公差。

理想的解决方案是在绘制蓝色圆圈后读取蓝色圆圈的颜色值,然后确定准确的颜色。如果您使用了正在使用的画布的位图,则可以调用bitmap.getPixel()。但是,如果你还没有它(你没有在onDraw方法中),我不知道有什么办法获得画布的位图。