Android ändern Canvas Hintergrundfarbe ohne irgendwelche Zeichnungen davon zu verlieren

8

Ich versuche einen Weg zu finden, den Hintergrund einer Leinwand mit einer Farbe festzulegen, die von einer benutzerdefinierten Farbauswahl aufgenommen wurde, ohne irgendwelche Zeichnungen daraus zu entfernen. Ich versuche, eine Anwendung zu erstellen, die auf Leinwand zeichnen und als PNG speichern kann. Aber wenn ich der aktuellen Leinwand einen neuen Hintergrund anlege, sind alle Zeichnungen weg. Ich benutze so etwas:

mCanvas.drawColor(picker.getColor());

Irgendwelche Ideen, wie ich Dinge zum Laufen bringen kann?

    
Android-Droid 22.04.2012, 14:20
quelle

7 Antworten

7

Die Antworten auf Ihre Frage weisen alle in die richtige Richtung: Sie müssen den Hintergrundfarbenblock und die Vordergrundzeichnung in separaten Ebenen trennen und sie dann zusammenführen, bevor Sie den gesamten Inhalt in einer PNG-Datei speichern. So gestaltet sich auch der Adobe Photoshop Workflow ... Wenn wir darüber nachdenken, ergibt das Sinn: Nehmen wir zum Beispiel eine Software wie MsPaint: Da sie keine Ebenen verwendet, muss sie sich auf Dinge wie Floodfill-Algorithmen verlassen erreichen (wenn auch in unvollständiger Weise) etwas, das entfernt einer Hintergrundveränderung ähnlich ist ...

Eine Möglichkeit, solch eine Sache zu implementieren, wäre die Instanziierung von zwei Canvas-Objekten, die von zwei verschiedenen Bitmaps unterstützt werden. Das erste Canvas-Bitmap-Paar wird für Ihre Zeichnung im Vordergrund verwendet, und das zweite Canvas-Bitmap-Paar wird für die Zeichnung mit verbundenen Layern verwendet (d. H. Vordergrundzeichnung + Hintergrundfarbblock). Dann wird das 2. Bitmap in einer .png-Datei gespeichert, wenn Sie es zum Speichern benötigen. Auf diese Weise speichert unser erstes Canvas-Bitmap-Paar Ihre Vordergrundinformationen, die nicht zerstört werden, wenn eine Hintergrundfarbe geändert werden muss. Jedes Mal, wenn eine Operation ausgeführt wird, können die Layer in das 2. Canvas-Bitmap-Paar zusammengeführt werden, so dass immer ein Bitmap mit dem richtigen Inhalt vorhanden ist, der nach Belieben gespeichert werden kann.

Hier ist eine benutzerdefinierte Ansicht, die ich gemacht habe, um diese Methode zu verdeutlichen. Es implementiert eine einfache Ansicht, die verwendet wird, um eine blaue Linie auf dem Berührungsbildschirm unter Verwendung eines Fingers zu malen, wobei sich eine Hintergrundfarbe in Abhängigkeit von der XY-Position des Fingers ändert, um eine Hintergrundfarbänderung ohne unnötige Codekomplexität einer vollständigen Implementierung zu demonstrieren mit einem Farbrad / Menüs / unter anderem :

%Vor%

Um diese Ansicht zu testen, sehen Sie hier eine Testaktivität, die die Klasse PaintView verwendet. Beide Dateien sind in einem Android-Projekt autark, so dass Sie es problemlos auf Ihrem realen Gerät testen können:

%Vor%     
epichorns 29.04.2012 08:39
quelle
4

Wenn Sie die Farbe zeichnen, wird sie über Ihre Zeichnungen gezeichnet. Sie müssen die Farbe zeichnen und dann alles andere wieder zeichnen.

    
omers 22.04.2012 14:47
quelle
1

Wenn Sie in Canvas ändern möchten, müssen Sie invalidate aufrufen, um diese Änderungen auf Ihrem Bildschirm anzuwenden. Und wenn Sie invalidate aufrufen, ruft Ihre onDraw() -Methode auf.

Wenn Sie nur die Hintergrundfarbe des Canvas vom Farbwähler ändern möchten, speichern Sie den Farbwert in der Variablen und rufen Sie nach dem Speichern der Variablen den Wert invalid auf. Nun wird Ihr onDraw() aufgerufen. Ändern Sie jetzt den Hintergrund des Canvas durch Aufruf von setBackgroundColor(color variable) in onDraw() und zeichne alles was du willst

    
Sameer 02.05.2012 06:50
quelle
1

Verwenden Sie canvas.drawARGB (a, r, g, b) und es wird für bestimmte

funktionieren     
Pranav 02.05.2012 10:49
quelle
0

Solange Ihr Hintergrund in einer anderen Farbe ist und sein wird, können Sie:

%Vor%

Oder Sie können Ihren Inhalt auf einer Offscreen-Bitmap zeichnen und den Hintergrund und dann den Offscreen auf die tatsächliche Bitmap zeichnen. Auf diese Weise können Sie die Hintergrundfarbe ändern, die bei der nächsten zweistufigen Zeichnung verwendet wird.

    
Bondax 26.04.2012 06:25
quelle
0

@ Android-Droide

Diese beiden Codezeilen haben mir sehr gut gefallen. Wann immer der Benutzer auf irgendeine Farbe klickt (zB: Rot) setze diese Farbe auf mPaint wie

%Vor%

und wann immer Sie die Leinwandfarbe ändern möchten

%Vor%

Dabei ist dv das Objekt der Klasse, die die Ansicht erweitert (Benutzerdefinierte Ansicht). Probieren Sie es aus und lassen Sie mich wissen, wenn Sie irgendwelche Probleme haben.

    
Deeps 23.01.2015 21:31
quelle
0

Vielleicht ist es eine alte Frage, aber ich möchte mit dieser Lösung beitragen. Wenn Sie die Bitmap aus einer Quelle nehmen und dann eine Zeichenfläche mit Canvas erstellen, kann das vielleicht zu Ihnen passen:

%Vor%

Ich hoffe, es hilft ...

    
JCarangoH 06.08.2015 14:30
quelle

Tags und Links