3 Stimmen

Rückgängig-Schaltfläche in Android Zeichen-App

Also möchte ich eine Undo-Schaltfläche für eine Zeichen-App implementieren, an der ich für Android arbeite. Meine aktuelle Idee ist, den aktuellen Zeichenpfad in eine Liste von Pfaden auf MotionEvent.ACTION_UP zu setzen. In onDraw() alles zeichnen, was in der Liste der Pfade steht. Wenn der Benutzer auf "Rückgängig" drückt, entfernen Sie den zuletzt gezeichneten Pfad aus der Liste der Pfade und rufen Sie invalidate() auf, wodurch onDraw() aufgerufen wird, der alles in der Pfadliste zeichnet. Da wir den vorherigen Pfad aus der Liste entfernt haben, sollte dieser Pfad nicht gezeichnet werden und daher "rückgängig gemacht" werden.

Das Problem, das ich habe, ist, dass der Pfad nie wirklich rückgängig gemacht zu werden scheint. Es scheint, als ob die Logik in meinem Kopf korrekt ist, aber diese Implementierung funktioniert nicht korrekt. Jede Hilfe wird sehr geschätzt.

Hier ist mein Code:

DrawingView.java:

Instanzvariablen (um die folgenden Methoden zu verdeutlichen):

private Context context;
private Path drawPath;
private Paint drawPaint;
private Paint canvasPaint;
private Canvas drawCanvas;
private Bitmap canvasBitmap;
private int previousPaintColor;
private int paintColor;
private float brushSize;
private float eraserSize;
private float lastBrushSize;
private boolean isErasing = false;
private List moveList = null;
private List undoList = null;
private List currentMoveList = null;

Aufgerufen vom Konstruktor:

private void setupDrawing() {
    drawPath = new Path();
    drawPaint = new Paint();

    brushSize = getResources().getInteger(R.integer.default_brush_size);
    lastBrushSize = brushSize;

    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);

    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

onDraw:

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    for (Path path : currentMoveList) {
        canvas.drawPath(path, drawPaint);
    }
    for (Path path : moveList) {
        canvas.drawPath(path, drawPaint);   
    }
}

onTouchEvent:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            currentMoveList.add(drawPath);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            drawCanvas.drawPath(drawPath, drawPaint);
            moveList.add(drawPath);
            drawPath = new Path();
            currentMoveList.clear();
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

undo() :

public void undo() {
    if (moveList.size() > 0) {
        undoList.add(moveList.remove(moveList.size() - 1));
        invalidate();   
    }
}

Mit freundlichen Grüßen,

Kyle.

1voto

kformeck Punkte 1633

Nach einigen Versuchen und Irrtümern, hier ist die Lösung:

Entfernen Sie diese Zeile Code:

canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);

aus der Methode onDraw() und alles funktioniert perfekt :)

0voto

**Heben Sie Ihre onDraw-Überschreibung auf ((GETESTET)) **

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
    for (Path path : currentMoveList) {
        canvas.drawPath(path, drawPaint);
    }
    for (Path path : moveList) {
        canvas.drawPath(path, drawPaint);   
    }
    super.onDraw(canvas);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X