2013-05-13 154 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