Clearing-Leinwand mit Canvas.drawColor()
ich versuche, ändern Sie das Hintergrundbild einer benutzerdefinierten Ansicht mit einigem Erfolg. das Bild wird sich ändern, aber das problem ist, dass ich immer noch die Spuren des alten Bildes. wenn ich Versuch, deaktivieren Sie die Leinwand vor dem zeichnen des neuen Bildes, es scheint nicht zu funktionieren. ich erstelle eine bitmap, um das Bild zu speichern. beim ändern der Bild, ich nenne Leinwand.drawColor() vor dem zeichnen des neuen Bildes das alte Bild weiterhin besteht. ich habe versucht drawColor(0), drawColor(Color.SCHWARZ), c.drawColor(0, PorterDuff.- Modus.KLAR), und keine der oben genannten arbeiten. als solche hatte ich in diesem post für die überprüfung von erfahreneren Köpfe, als mir.
ist der aktuelle 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);
}
}
InformationsquelleAutor Prmths | 2011-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau wie Sie, kämpfte ich, wie klar eine top layer/surfaceview in meine multiple layer/surfaceview app. Nach 2 Tagen Suche und Codierung, fand ich heraus meinen eigenen Weg und das ist, wie ich räumte eine Leinwand vor dem zeichnen, können Sie es verwenden, wenn mehrere Ebenen/surfaceviews. Die hintergrund-Ebene wird nicht mit abgedeckt werden schwarz, das ist der trick.
InformationsquelleAutor longdooooo
Tun, die Sie nicht benötigen, fordern auch invalidate() aus innerhalb der onDraw-Methode, so dass änderungen in onDraw werden auf dem Bildschirm aktualisiert?
Die invalidate() in der Schalter ruft Ihre onDraw nach Aufruf setBgnd, aber es gibt nichts zu sagen neu, nachdem Sie änderungen vorgenommen haben, um den Canvas-Bereich.
Ah du hast Recht, hatte zu gehen, schauen Sie, developer.android.com/guide/topics/graphics/index.html. Sorry, mein Verständnis war nicht korrekt.
Ich dachte das am Anfang auch. Die Frage für mich ist, wenn invalidate() zeigt eine Ansicht neu zu zeichnen sich, warum nicht dieser Ansicht komplett selbst aktualisieren, bis es zog später in einer animation? die untere Hälfte sieht das Objekt richtig, aber die andere Hälfte ist immer noch die alte Oberfläche.
ich habe auch versucht mit einem 8-bit-Bild als ich gelesen habe, dass es möglich ist, das Problem wird verursacht durch die Schwierigkeiten, android hat mit 32-bit-Bilder. ich glaube nicht, dass das der Fall war und ich wusste, dass es nicht hilfreich war. ich habe auch versucht setBackgroundResource() (eigentlich das, was ich versuchte zunächst selbst, bevor die Mühe mit einem canvas-Bereich), aber es ist auch nicht die Arbeit, auch wenn man von innen onDraw().
InformationsquelleAutor C0deAttack
Können Sie Canvas die Methode
drawRGB
.Beachten Sie, dass drawRGB nur verwendet
drawColor(Color.rgb(r, g, b))
InformationsquelleAutor ojs
Ich nur treffen dieses problem.
Ich es lösen, indem er "..Drawxxx();Schreiben();" mindestens 3 mal,es funktioniert gut.
Denke ich ,"doppelte Pufferung" ist der Grund,manchmal ist es "Tribal Pufferung".müssen wir wiederholen unsere Zeichnung, um sicherzustellen, dass jeder "buffer" ist aktualisiert..
InformationsquelleAutor ohzso