2010-01-15 70 views
4

我试图替换颜色的东西是在Canvas使用AvoidXferMode绘制的颜色。 从Android文档,它看起来像它正是我需要的:AvoidXferMode更换画布

AvoidXfermode xfermode将无处不在画SRC除了在opColor的顶部或取决于模式,只绘制在opColor的顶部。

我想要是这样的:

Paint paint = new Paint(); 
paint.setColor(Color.RED); 
canvas.drawPaint(paint); // actually drawing a bitmap here 
paint.setXferMode(new AvoidXferMode(Color.RED, 0, TARGET); 
paint.setColor(Color.GREEN); 
canvas.drawPaint(paint); 

然而,这只是给出了一个红色的屏幕,而不是绿如我所期望的(绿色替换红色)。我想我错过了一些地方......任何建议?

回答

5

我终于发现了什么问题,这里有一些线索:AvoidXferMode Tolerance但它真的打我,当我看到这篇文章http://stuffthathappens.com/blog/2010/06/04/android-color-banding/由埃里克·伯克。容差失败,因为视图画布不处于8888模式。

这意味着,当你画一个颜色或位图画布上的颜色被转换到目标像素格式和颜色可能会略有变化。要解决这个问题,您可以切换整个窗口像素格式,如Eric的文章中所示,或者您可以绘制到8888后台缓冲区。

不幸的链接Eric的职位是死的,但罗马盖伊也有类似的写在这里:http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/

+0

链接到Eric Burke的页面现已停止。 – Trevor 2012-08-15 22:06:08

+0

@Trevor更新了这篇文章,你可以改正它,而不是降低它。解决方案的要点不在于链接,而在于答案本身。 – botteaap 2012-08-17 06:55:03

+0

非常感谢澄清 - 现在upvoted。对不起,我自己没有改正,因为我真的没有从你的答案中得到完整的图片,却没有看到埃里克的页面。 – Trevor 2012-08-17 10:18:05

0

我目前有同样的问题,但我通过指定255作为宽容,而得到它的工作。根据API文档,这是错误的(它应该在这个完全公差设置的任何地方绘制目的地),但由于某些原因,值255正好是值0应该做的。

+0

它似乎并没有为我工作,设定耐受255影响整体形象,不仅目标颜色...你可以发布一些示例代码? – botteaap 2010-03-31 15:56:46

+0

是的,你是对的。这取决于颜色。我的例子在RED背景上使用RED和BLUE。然后容忍255的作品(至少对我来说),但如果你使用LTGRAY和DKGRAY为例,那么它失败。你可以找到我的代码在这里:http://stackoverflow.com/questions/2553694/avoidxfermode-tolerance 我放弃了这个AvoidXferMode和使用PorterDuffXfermode与替代SRC_IN和SRC_OUT模式。 – kayahr 2010-04-01 13:50:47