绘制多个路径时颜色重叠

时间:2013-05-13 12:50:00

标签: android canvas drawing

的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设置为绘画但不按预期工作。

请帮助我并建议我,我该怎么做才能解决这个问题。 任何建议将不胜感激。 感谢

4 个答案:

答案 0 :(得分:1)

你试过了吗?

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

毕竟你想要的是一个异或(XOR) - 第一行或第二行,但不是彼此重叠。

我没有试过这个,看起来似乎是合乎逻辑的答案。

答案 1 :(得分:1)

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

对我有用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

由于AvoidXferMode 已贬值,这对使用API​​ 16+ 的人会很有帮助。这更像是一种解决方法。但工作得很好。出现这种重叠错误的原因是为绘制设置了 alpha 值。

例如,如果您想使用带有 alpha 的“红色”颜色 您实际上可以使用实用程序函数将透明度设置为“红色”,而不是传递 mPaint.setAlpha()。

所以在这种情况下,只需使用 mPaint.setColor(Color.parseColor(getTransparentColor(Color.Red, 50)));并且不要使用 setAlpha。

使用以下代码获得透明颜色。

public static String getTransparentColor (int colorCode, int transCode) {
        // convert color code into hexa string and remove starting 2 digit

        String color = defaultColor;
        try{
            color = Integer.toHexString(colorCode).toUpperCase().substring(2);
        }catch (Exception ignored){}

        if (!color.isEmpty() && transCode < 100) {
            if (color.trim().length() == 6) {
                return "#" + convert(transCode) + color;
            } else {
                Log.d(TAG, "Color is already with transparency");
                return convert(transCode) + color;
            }
        }
        // if color is empty or any other problem occur then we return deafult color;
        return "#" + Integer.toHexString(defaultColorID).toUpperCase().substring(2);
    }

  /**
     * This method convert numver into hexa number or we can say transparent code
     *
     * @param trans number of transparency you want
     * @return it return hex decimal number or transparency code
     */
    public static String convert(int trans) {
        String hexString = Integer.toHexString(Math.round(255 * trans / 100));
        return (hexString.length() < 2 ? "0" : "") + hexString;
    }

注意: 即使在所有这些更改之后,如果出现重叠错误,也请添加以下代码。

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