Hintergrund
Ich habe eine GUI mit einigen FireMonkey-Steuerelementen erstellt.
Problem
Die Interaktion mit den Benutzersteuerelementen verhindert Aktualisierungen der animierten Steuerelemente, was zu ruckartigen diskontinuierlichen Animationen führt.
Das animierte Steuerelement im obigen Video wird von einer TTimer-Komponente gesteuert. Das Problem besteht weiterhin, wenn Sie die Animationskomponenten von FireMonkey verwenden.
Untersuchung
Die Schieberegler rufen Repaint () auf, wenn sie angepasst werden. Durch einfaches Anpassen eines Schiebereglers wird ein dichter Strom von Repaint () - Aufrufen generiert, die verhindern, dass andere Steuerelemente aktualisiert werden.
Was ist zu tun?
Das Einfrieren von Animationen, während ein Steuerelement ständig aktualisiert wird, ist für meine Anwendung nicht geeignet. Mein erster Gedanke ist, die Repaint () -Aufrufe für etwas ähnlich der VCL Invalidate () -Methode zu tauschen, aber FireMonkey hat nichts vergleichbares AFAIK.
Gibt es eine gute Problemumgehung für dieses Problem?
Ich habe eine Timer-basierte Repaint-Methode erstellt, wie Arnaud Bouchez in den obigen Kommentaren vorgeschlagen hat. Bisher scheint es zu funktionieren.
Code
%Vor%==
Verwendung
Ein Steuerelement kann durch einen Aufruf von:
neu gezeichnet werden %Vor%Die InvalidateControl () - Prozedur aktualisiert das Steuerelement nicht sofort. Stattdessen fügt es das Steuerelement einer Liste hinzu. Ein globaler Timer überprüft später die Liste, ruft Repaint () auf und entfernt das Steuerelement aus der Liste. Mit dieser Methode kann ein Steuerelement bei Bedarf ungültig gemacht werden, es blockiert jedoch nicht, dass andere Steuerelemente aktualisiert werden, wie dies bei schnellen Repaint () -Aufrufen der Fall ist.
Tags und Links delphi firemonkey