- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对以下代码有疑问:
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文档?安卓?我?
最佳答案
您的 Canvas 位深度是 RGB_565 还是 ARGB_8888?我在两种格式上都对此进行了测试。它适用于 32 位 Canvas ,但不适用于 16 位 Canvas 。 16 位图像可能无法显示您正在绘制的确切颜色 (0xFF0000FF),因此当您绘制第一个蓝色圆圈时,它会发生轻微的变化(人眼无法察觉)。然后,当您执行回避时,以零容差精确定位蓝色时,不会显示任何内容,因为真正的蓝色不在图像中。
255 的公差有效,因为它允许避免匹配“几乎是蓝色”的颜色,结果将是一个“几乎是红色”的圆圈。如果使用太高的公差令人不安,请尝试非常低的公差(从 1 开始向上),直到找到一个很小但仍与您要替换的“几乎是蓝色”相匹配的公差。
理想的解决方案是在绘制蓝色圆圈后读取它的颜色值,并以准确的颜色为目标。如果您有正在使用的 Canvas 的位图,并且可以调用 bitmap.getPixel()
,这将是可能的。但是,如果您还没有(在 onDraw 方法中没有),我不知道有什么方法可以获取 Canvas 的位图。
关于android - AvoidXferMode容差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2553694/
我是一名优秀的程序员,十分优秀!