2011-01-10 6 views
11

Ich versuche, das Hintergrundbild einer benutzerdefinierten Ansicht mit einigem Erfolg zu ändern. Das Bild ändert sich, aber das Problem ist, dass ich immer noch Spuren des alten Bildes sehe. Wenn ich versuche, die Leinwand zu leeren, bevor ich das neue Bild zeichne, scheint es nicht zu funktionieren. Ich erstelle ein Bitmap, um das Bild zu speichern. Wenn ich das Bild ändere, rufe ich Canvas.drawColor() auf, bevor ich das neue Bild zeichne, aber das alte Bild bleibt erhalten. Ich habe drawColor (0), drawColor (Color.BLACK), c.drawColor (0, PorterDuff.Mode.CLEAR) versucht, und keine der oben genannten Funktionen. als solche musste ich dies für die Überprüfung von erfahreneren Köpfen post als meine.Löschen von Canvas mit Canvas.drawColor()

der eigentliche Code ist wie folgt:

private int bgnd; 
private boolean switching; 

public void setBgnd(int incoming){ 
    switching = true; 
    switch (incoming){ 

    case R.drawable.image1: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    case R.drawable.image2: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    } 
} 



protected void onDraw(Canvas c){ 
    if(switching == true){ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawColor(0, PorterDuff.Mode.CLEAR); 
     c.drawBitmap(b, 0, 0, null); 
     switching = false; 

    }else{ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawBitmap(b, 0, 0, null); 
    } 
} 

Antwort

30

Genau wie Sie hatte ich Schwierigkeiten, eine oberste Schicht/Oberflächenansicht in meiner Multilayer/Oberflächenansicht App zu löschen. Nach 2 Tagen Suche und Kodierung habe ich meinen eigenen Weg gefunden und so habe ich eine Leinwand vor dem Zeichnen gelöscht, sie kann sie verwenden, wenn mehrere Ebenen/Oberflächenansichten vorhanden sind. Die Hintergrundebene wird nicht mit Schwarz bedeckt, das ist der Trick.

Paint paint = new Paint(); 
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 
canvas.drawPaint(paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); 
// start your own drawing 
+0

Ich denke, dass ich mehr als 2 Tage gebraucht hätte, um das herauszufinden, im Gegensatz zu den 2 Minuten, die ich brauchte, um hierher zu kommen. Thx strangeInAStrangerLand + longdooooo –

2

Sie benötigen nicht auch invalidate() aufzurufen, aus Ihrer OnDraw-Methode, so dass in diesem OnDraw vorgenommenen Änderungen auf dem Bildschirm aktualisiert werden?

Die invalidate() in Ihrem Schalter wird Ihre onDraw aufrufen, nachdem Sie setBgnd aufrufen, aber es gibt nichts Neues zu neu zeichnen, nachdem Sie Änderungen an der Canvas vorgenommen haben.

+1

Ich habe den Eindruck, dass das Aufrufen von invalidate() eine Ansicht anfordert, onDraw() aufzurufen und seine self zu zeichnen. Wenn dieser Aufruf in die Methode eingefügt würde, würde dies dazu führen, dass die Schleife für immer wiederholt wird, wie im Beispiel zu sehen ist: http://www.anddev.org/basic_and_simple_2d_drawing_-_animation-t3085.html – Prmths

+0

Ah, du hast Recht, musste schau es dir an, http://developer.android.com/guide/topics/graphics/index.html. Entschuldigung, mein Verständnis war nicht korrekt. – C0deAttack

+0

Das dachte ich auch am Anfang. Die Frage ist für mich, wenn invalidate() einer Ansicht sagt, dass sie sich neu zeichnen soll, warum wird diese Ansicht nicht vollständig neu gezeichnet, bis sie später in einer Animation verschoben wird? die untere Hälfte des Objekts sieht richtig aus, die andere Hälfte ist immer noch die alte Oberfläche. – Prmths

2

Sie können Canvas-Methode drawRGB verwenden.

+0

drawRGB() löscht den Alphakanal nicht und die Bitmap wird undurchsichtig, daher kann sie nur verwendet werden, wenn die Bitmap die einzige Ebene oder die Hintergrundebene ist. Es gibt auch eine Methode drawARGB(), mit der auch der Alpha-Kanal behandelt werden kann. Habe es aber nicht versucht, wenn es funktioniert. –

+1

Beachten Sie, dass drawRGB nur 'drawColor (Color.rgb (r, g, b))' 'verwendet – TameHog