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

オンドロー

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

結局のところ、必要なのは排他的 OR (XOR) です。最初の行または 2 番目の行のいずれかですが、両方が重なっているわけではありません。

私はこれを試していませんが、論理的な答えのようです。

于 2014-01-23T15:11:40.193 に答える
0

同様の問題がありました。私が使用した:

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

パスを透明にすることなく、宛先ピクセルの上にピクセルを描画できます。

于 2021-11-16T12:25:56.227 に答える
0
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));
于 2014-11-25T15:17:28.417 に答える