0

数组列表

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();

在此处输入图像描述

上面的代码能够使用手指在画布上绘图。但问题是当多条路径相互交叉时,它会重叠。我附上了我的应用程序快照的链接。重叠在绿色矩形内。我将 Xfermode 设置为绘画,但没有按预期工作。

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

4

5 回答 5

1

你有没有尝试过:

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

毕竟你想要的是一个异或(XOR) - 第一行或第二行,但不是两者都在彼此之上。

我没有尝试过,这似乎是合乎逻辑的答案。

于 2014-01-23T15:11:40.193 回答
1
mPaint.setXfermode(new AvoidXfermode(Color.RED, 90, Mode.AVOID)); 

这个对我有用。

于 2014-11-28T06:40:40.573 回答
0
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));
于 2014-11-25T15:17:28.417 回答
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));
于 2021-07-10T18:27:08.060 回答
0

我有类似的问题。我用了:

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

它允许在目标像素上绘制像素而不使路径透明。

于 2021-11-16T12:25:56.227 回答