Ich habe eine benutzerdefinierte Ansicht, die meinen gesamten Bildschirm füllt. (Eine Klaviertastatur) Wenn ein Benutzer die Taste berührt, wird invalidate()
aufgerufen und die gesamte Tastatur wird neu gezeichnet, um den neuen Zustand mit einem berührten Schlüssel anzuzeigen.Android: Wie wird eine benutzerdefinierte Ansicht teilweise neu gezeichnet?
Derzeit ist die Ansicht sehr einfach, aber ich plane, ein bisschen mehr nette Grafiken hinzuzufügen. Da die gesamte Tastatur dynamisch gerendert wird, würde dies das Neuzeichnen der gesamten Tastatur teurer machen.
Also dachte ich, lass uns in teilweise Neuzeichnen schauen. Jetzt rufe ich invalidate(Rect dirty)
mit der korrekten schmutzigen Region an. Ich setze meine onDraw(Canvas canvas)
Methode, um nur die Schlüssel in der schmutzigen Region zu zeichnen, wenn ich tatsächlich eine teilweise Neuzeichnung wünsche. Dies führt dazu, dass diese Tasten gezeichnet werden, aber der Rest der Tastatur ist komplett schwarz/nicht gezeichnet.
Bin ich falsch darin zu erwarten, dass das Aufrufen von invalidate(Rect dirty)
würde die aktuelle canvas
"zwischenspeichern" und nur "erlaubt" in der schmutzigen Region zeichnen?
Gibt es irgendeine Möglichkeit, dass ich erreichen kann, was ich will? (Ein Weg, um „Cache“ die Leinwand und nur den schmutzigen Bereich neu zu zeichnen“
Hmm, ich mag diese Lösung nicht, weil der Grund, warum seine Schlüssel teilweise gezeichnet sind, ist, weil er sowieso zuerst eine volle Auslosung seiner Kanvas haben sollte. Die Frage ist also, warum seine Leinwand überhaupt nicht richtig gezeichnet hat. –
Ich muss beachten, dass ich jetzt verstehe, dass wenn Sie 'invalidate' mit einem dirty' rect' aufrufen, Sie einfach Ihren normalen Zeichnungscode verwenden können, und es sollte nur die Zeichenoperationen ausführen, die sich in der schmutzigen 'rect' befinden. 'Canvas' verwirft die Operationen, die außerhalb des' rect' liegen. Dennoch bedeutet dies, dass viel von Ihrem eigenen Code immer noch gerendert wird und in meinen Tests mit HW-Beschleunigung war es langsamer als nur die Ansicht vollständig zu rendern. – Peterdk
Beachten Sie, dass zum Zeichnen von Bitmaps auf Canvas der Farbparameter null sein kann, z. 'canvas.drawBitmap (Bitmap, 0, 0, null)'. – greg7gkb