Implementierung eines Radiergummis in einer Android-Zeichen-App - schwarz hinterlegt und dann transparent

Ich habe eine Zeichen-App für Android und versuche gerade, einen echten Radiergummi hinzuzufügen. Früher hatte ich nur weiße Farbe für einen Radiergummi verwendet, aber das geht nicht mehr, da ich jetzt Hintergrundfarben und -bilder zulasse. Ich mache das, indem ich eine Bildansicht unter meiner transparenten Leinwand habe.

Das Problem, mit dem ich konfrontiert bin, ist, dass jedes Mal, wenn ich meinen Radierer aktiviere, eine solide schwarze Spur gezeichnet wird, während ich den Finger unten habe, aber sobald ich loslasse, wird sie transparent. Siehe die Screenshots unten:

So sieht es aus, während mein Finger auf dem Bildschirm ist - eine feste schwarze Spur

So sieht es aus, wenn ich meinen Finger vom Bildschirm entferne

Es scheint also, als nähere ich mich, aber ich kann nicht die richtige Kombination von Einstellungen finden, um die schwarze Spur zu vermeiden, während sich mein Finger beim Löschen berührt. Hier sind einige relevante Code-Schnipsel:

onDraw

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.TRANSPARENT);
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
    canvas.drawPath(mPreviewPath, mPaint);
}

onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent event) {
    float currentX = event.getX();
    float currentY = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touchStart(currentX, currentY);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touchMove(currentX, currentY);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touchUp(currentX, currentY);
            invalidate();
            break;
    }
    return true;
}

Aktueller Versuch der Radiergummieinstellungen

public void startEraser() {
    mPaint.setAlpha(0);
    mColor = Color.TRANSPARENT;
    mPaint.setColor(Color.TRANSPARENT);
    mPaint.setStrokeWidth(mBrushSize);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setMaskFilter(null);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    mPaint.setAntiAlias(true);
}

Es gibt einige andere Beiträge über Radiergummis, aber die meisten sagen nur, dass sie verwendet werden sollenPorterDuff.Mode.CLEAR, setMakFilter(null) und das sollte funktionieren. In meinem Fall nicht. Egal was ich versuche, ich bekomme erst die schwarze Spur und dann das gewünschte Ergebnis, nachdem ich loslasse.

Bei Bedarf kann ich mehr Code bereitstellen.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage