2

我对以下代码有疑问:

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 文档?安卓?我?

4

1 回答 1

3

你的画布位深度是 RGB_565 还是 ARGB_8888?我在这两种格式上都进行了测试。它适用于 32 位画布,但不适用于 16 位画布。16 位图像可能无法显示您正在绘制的确切颜色(0xFF0000FF),因此当您绘制第一个蓝色圆圈时,它会发生轻微的变化(并且人眼无法察觉)。然后,当您执行回避时,以容差为零的精确蓝色为目标,什么都不会显示,因为真正的蓝色不在图像中。

255 的容差有效,因为这允许避免匹配“几乎是蓝色”的颜色,结果将是一个“几乎是红色”的圆圈。如果使用如此高的容差令人不安,请尝试非常低的容差(从 1 开始并向上),直到找到一个很小但仍与要替换的“几乎蓝色”匹配的容差。

理想的解决方案是在绘制蓝色圆圈后读取它的颜色值,并以准确的颜色为目标。如果您有正在使用的画布的位图,这将是可能的,并且您可以调用bitmap.getPixel(). 但是,如果您还没有画布的位图(在 onDraw 方法中没有),我不知道有任何方法可以获取画布的位图。

于 2010-04-01T18:34:35.973 回答