Android: ungültig (schmutzig)

8

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?

    
1'' 28.12.2012, 23:20
quelle

2 Antworten

14

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.

    
EyalBellisha 24.04.2013, 15:50
quelle
1

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:

%Vor%

Jetzt können Sie invalidate(dirty rect) verwenden.

    
Alireza Akhoundi 16.08.2016 09:31
quelle