Es sieht so aus, als ob Android invalidate (Rect dirty)
wirklich nicht mag, was dazu benutzt wird, nur einen Teil einer Leinwand zu entwerten. Wenn ich einen Teil eines Canvas ungültig mache (unten grün dargestellt) und ein ToggleButton
außerhalb des Canvas gleichzeitig neu gezeichnet werden muss, wird der gesamte rot dargestellte Bereich gelöscht! Es sieht so aus, als ob Android nur alles innerhalb des kleinsten Rechtecks ungültig macht, das die Vereinigung der beiden Regionen umfasst, die neu gezeichnet werden müssen, selbst wenn sich eine der Regionen außerhalb der Ansicht befindet, deren Canvas ungültig ist.
Ist das Standardverhalten, und wenn ja, warum sollte jemand eine teilweise Ungültigkeitserklärung verwenden?
Android hat eine Klasse namens ViewRootImpl
. Diese Klasse gehört zu jedem Fenster, das Sie auf dem Bildschirm sehen (der Begriff Fenster ist hier etwas verwirrend, daher ist für diese Erklärung ein Fenster das Layout der Hauptaktivität ohne irgendwelche Dialoge oder Popups oben).
Dieses Layout wird ständig durchlaufen, was bedeutet, dass Android nur darauf wartet, ein schmutziges Rechteck für dieses Fenster zu haben und es zu zeichnen. Da dieses Fenster viele Ansichten (Schaltflächen usw.) enthalten kann, durchläuft es alle und fragt jeden, ob es neu gezeichnet werden muss.
Jede Ansicht gibt ein schmutziges Rechteck in ViewRootImpl
zurück und alle diese Rechtecke werden zu einem großen Rechteck zusammengefügt, das am Ende neu gezeichnet wird.
Warum macht es das? naja, die ViewRootImpl
bittet die WindowManagerService
für eine Canvas
zu zeichnen. Dies bedeutet, dass alle Ansichten in einem Fenster tatsächlich ein Canvas
teilen, immer wenn eine Traversierung stattfindet.
Was Ihre Frage betrifft, wenn nur ein bestimmtes View
ein schmutziges Rechteck hätte, dann würde nur dieses schmutzige Rechteck gezeichnet werden, aber da eine andere Ansicht auch eins hat, enthält das schmutzige Rechteck beides.
Dieses Problem wird durch Hardwarebeschleunigung verursacht. Sie müssen es in Ihrer Aktivität deaktivieren, um invalidate(dirty rect)
zu verwenden. Um die Hardwarebeschleunigung in Ihrer Aktivität zu deaktivieren, öffnen Sie die Manifestdatei und fügen Sie Folgendes hinzu:
Jetzt können Sie invalidate(dirty rect)
verwenden.
Tags und Links android android-canvas invalidate