2013-05-13 153 views
0

的ArrayList顏色重疊

ArrayList<Pair<Path, Float>> foregroundPaths = new ArrayList<Pair<Path, Float>>(); 

油漆動初始化

mPaint = new Paint(); 
    mPaint.setAntiAlias(false); 
    mPaint.setDither(true); 
    mPaint.setColor(0x0FFF0000); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.BEVEL); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(Math.abs(ImageViewTouch.brushSize 
        /getScale())); 

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)); 

    mPaint.setAlpha(0x80); 

的OnDraw

canvas.save(); 


    displayRectF = new RectF(); 


    canvas.concat(getDisplayMatrix()); 

    rect = canvas.getClipBounds(); 
    displayRectF.set(rect); 

    for (Pair<Path, Float> p : foregroundPaths) { 
     mPaint.setStrokeWidth(p.second); 
     canvas.drawPath(p.first, mPaint); 
    } 



    canvas.restore(); 

enter image description here

以上代碼可以使用手指在畫布上繪製。但問題是當多條路徑交叉重疊時。我附上了我的應用快照的鏈接。 重疊在綠色矩形內。我設置Xfermode來繪製,但沒有按照我的預期工作。

請幫我,建議我,我該怎麼做才能解決這個問題。 任何建議將不勝感激。 感謝

+0

試過以下?對你起作用嗎? – Raghunandan 2013-05-13 13:48:52

+0

爲什麼即使使用這個mBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888),突然間也不接受 – Raghunandan 2013-05-16 13:11:51

+0

; mCanvas = new Canvas(mBitmap);它的故事同樣如此。 doe snot解決。所以我想我在這方面的答案是正確的。 – Raghunandan 2013-05-16 13:16:29

回答

1
mPaint.setXfermode(new AvoidXfermode(Color.RED, 90, Mode.AVOID)); 

它爲我工作。

+0

AvoidXfermode在API級別16中已被棄用 – kldavis4 2015-11-20 19:48:28

1

你試過:

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); 

畢竟你想要的是一個異或(XOR) - 在彼此的頂部或者第一線或第二線,但不能同時使用。

我還沒有嘗試過這一點,只是看起來像是合乎邏輯的答案。

0
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)); 
+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – 2014-11-25 16:03:53

+0

@PieterGoosen對不起,但據我看到我的答案直接關係到原來的問題。 ravi ross問如何避免兩個路徑在半透明狀態下重疊,並使用PorterDuff.Mode.OVERLAY模式就是這樣。如果你認爲我不明白這個問題,請糾正我。 – 2014-11-27 15:26:24