【问题标题】:color overlapping when drawing multiple path绘制多条路径时颜色重叠
【发布时间】:2021-11-16 20:25:56
【问题描述】:

数组列表

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

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

【问题讨论】:

  • 试过以下?对你有用吗?
  • 你怎么突然不接受了
  • 即使有了这个 mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = 新画布(mBitmap);这是同一个故事。不解决。所以我想我在这种情况下的回答是正确的。
  • 它不是解决方案,但您指出了原因。所以,如果我对这个答案投赞成票,可能有人会感到困惑。
  • @raviroshan 你能提供一些代码来看看你是如何解决的吗?

标签: android canvas drawing


【解决方案1】:

你试过了吗:

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

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

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

【讨论】:

    【解决方案2】:
    mPaint.setXfermode(new AvoidXfermode(Color.RED, 90, Mode.AVOID)); 
    

    它对我有用。

    【讨论】:

    • AvoidXfermode 在 API 级别 16 中已弃用
    【解决方案3】:
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • @PieterGoosen 很抱歉,但据我所知,我的回答与原始问题直接相关。 ravi roshan 询问如何避免两条路径在半透明时重叠,而使用 PorterDuff.Mode.OVERLAY 模式正是为此。如果您认为我没有理解问题,请纠正我。
    【解决方案4】:

    由于 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));
    

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 1970-01-01
        • 2012-05-21
        • 2020-11-15
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        相关资源
        最近更新 更多