Ich arbeite an einem Testprojekt, das dem Beispiel von FingerPaint
in Android SDK-Demos ähnelt. Ich habe versucht, Rückgängig / Redo-Funktionalität in meinem Projekt zu implementieren, aber die Dinge, die ich versuchte, funktionierte nicht wie erwartet. Ich finde ähnliche Fragen über das Internet und hier, aber sie haben mir nicht geholfen, deshalb stelle ich eine neue Frage.
Hier ist eine Idee, was ich eigentlich mache:
%Vor%Irgendwelche Vorschläge / Ideen / Beispiele, die die beste Art sind, diese Funktionalität in meinem Projekt zu implementieren?
Ich weiß nicht, ob Sie daran gedacht haben, aber so mache ich es. Anstatt es in nur einem Pfad zu speichern, speichern Sie ein Array mit allen Pfaden, so kann der Benutzer viele Linien zeichnen, mit einer kleinen Modifikation können Sie auch Multitouch hinzufügen.
Um das Rückgängigmachen und Wiederherstellen zu ermöglichen, entfernen oder fügen Sie einfach den letzten Pfad aus der Variablen paths
hinzu
und speichern Sie sie in einem neuen Array. Etwas wie:
Hier ist mein modifiziertes Panel, ich kann es jetzt nicht ausprobieren, aber die obigen Methoden sollten funktionieren! Ich hoffe es hilft! (Es gibt einige zusätzliche Variablen, entfernen Sie sie einfach:)
%Vor%Eine Möglichkeit, eine do / redo-Funktionalität zu implementieren, besteht darin, einen Methodenaufruf und alle für den Aufruf benötigten Informationen in ein Objekt einzufügen, damit Sie sie speichern und später aufrufen können - das Befehlsmuster .
In diesem Muster hat jede Aktion ihr eigenes Objekt: DrawCircleCommand, DrawPathCommand, FillColorCommand usw. In jedem Objekt wird die draw () -Methode auf einzigartige Weise implementiert, aber immer als draw (Canvas-Canvas) aufgerufen, was den CommandManager erlaubt um die Befehle zu durchlaufen. Um dies rückgängig zu machen, iterieren Sie über die Objekte, die die Methode undo () aufrufen;
Jedes Befehlsobjekt implementiert eine Schnittstelle
%Vor%Ein Objekt würde wie folgt aussehen:
%Vor%}
Ihre Befehle werden dem CommandManager hinzugefügt:
%Vor%und einen Befehl rückgängig zu machen, den Sie gerade aufrufen:
%Vor%Der CommandManager speichert die Befehle in einer Datenstruktur, z. Liste, die es iterativ über die Befehlsobjekte ermöglicht.
Hier finden Sie eine vollständige Anleitung hier um das Befehlsmuster mit Do / Rückgängig für Canvas-Zeichnung auf Android zu implementieren.
Hier finden Sie ein weiteres Tutorial zur Implementierung des Befehlsmusters in Java ;
Die beste Lösung ist, dass Sie Ihre eigene Undo / Redo-Engine implementieren.
Speichern Sie in einem Array jede einzelne Aktion, die Sie in einem Array ausführen (dh. [0] Kreis in Position x1, y1, [1] Linie von x2, y2 bis x3, y3, etc)
zeichne
Wenn Sie die Rückgängigmachung rückgängig machen müssen, löschen Sie die Zeichenfläche und zeichnen Sie alle n - 1 Aktionen neu von [0] bis [n - 1]
Wenn du mehr rückgängig machst, musst du einfach von [0] bis [n - 2] usw. malen
Ich hoffe, es gibt Ihnen einen Hinweis
Prost!
Ich denke, dass Sie in diesem Fall zwei Leinwände verwenden können. Sie wissen, wann der Benutzer mit dem Zeichnen beginnt und wann er endet. So können Sie in touch_start
eine Kopie Ihres aktuellen Canvas erstellen. Wenn der Nutzer auf "Rückgängig machen" klickt, wird die aktuelle Arbeitsfläche durch die zuvor gespeicherte ersetzt.
Dies sollte garantieren, dass Sie den vorherigen Zustand des Bildes haben werden, aber ich bin mir nicht sicher über die Leistung.
Tags und Links android paint android-view