2010-01-15 46 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