以下代码有问题:

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

最佳答案

您的画布位深度是rgb_还是argb_?我测试了两种格式。它在32位画布上工作,但在16位画布上不工作。16位图像可能无法显示您正在绘制的确切颜色(0xff0000ff),因此当您绘制第一个蓝色圆圈时,它会稍微改变(人眼无法察觉)。然后,当执行“避免”时,以精确的蓝色为目标,公差为零,则不会显示任何内容,因为图像中不存在真正的蓝色。
255的公差是有效的,因为这允许避免匹配“几乎蓝色”的颜色,结果将是一个“几乎红色”的圆圈。如果使用这么高的公差令人不安,请尝试非常低的公差(从1开始向上),直到找到一个小的公差,但仍然匹配要替换的“几乎蓝色”。
理想的解决方案是在绘制完蓝色圆圈后读取其颜色值,并以该颜色为目标。如果您有正在使用的画布的位图,并且可以调用bitmap.getPixel(),则这是可能的。但是,如果您还没有画布的位图(在ondraw方法中没有),我不知道如何获取它。

关于android - 避免XferMode公差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2553694/

10-10 09:51