2010-03-31 59 views
2

我有下面的代碼有問題:AvoidXferMode公差

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文檔? Android的?我?

回答

3

您的畫布位深度是RGB_565還是ARGB_8888?我測試了這兩種格式。它在32位畫布上工作,但無法在16位畫布上工作。 16位圖像很可能無法顯示您正在繪製的確切顏色(0xFF0000FF),所以當您繪製第一個藍色圓圈時,它會稍微改變(對人眼無法察覺)。然後,當您執行避免操作時,將容差設爲零的精確藍色,則不顯示任何內容,因爲真藍色不在圖像中。

容差爲255的作品,因爲它允許避免匹配「幾乎是藍色」的顏色,結果將是一個「近乎紅色」的圓圈。如果使用高度不穩定的容差,請嘗試非常小的容差(從1開始並向上),直到找到一個很小但仍然與要替換的「幾乎是藍色」相匹配的容差。

理想的解決方案是在繪製藍色圓圈後讀取它的顏色值,並確定其顏色。如果你有你正在使用的畫布的位圖,這將是可能的,你可以撥打bitmap.getPixel()。但是,我不知道如何獲得畫布的位圖,如果你還沒有它(你不在onDraw方法中)。

+0

謝謝。而已。 – kayahr 2010-04-11 14:50:50