Laden...

Animation (Height verändern) eines Control optimieren?

Erstellt von Frokuss vor 4 Jahren Letzter Beitrag vor 4 Jahren 936 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren
Animation (Height verändern) eines Control optimieren?

Hallo zusammen 😃

ich habe mir eine Klasse erstellt, bei der ich die Höhe eines Controlls ändern kann und diese dann in einem angegebenen Zeitintervall (150 ms) seine aktuelle Größe zur neuen Größe verändert. Allerdings finde ich, dass diese "Animation" nicht flüssig aussieht. Dabei wird alle 5ms die größe neu berechnet und geändert.

Anmerkung: Die "Animation" beeinflusst auch alle Geschwister (Top) und alle Eltern (Height)

Hat jemand eine Idee, was, wie und wo ich besser machen könnte? Ich poste einfach mal meinen kompletten Code (~70 Zeilen).

   class AnimationResizeHeight {
        double oldHeight, newHeight, interval;
        Control control;
        DateTime triggerTime = DateTime.Now;

        private static System.Timers.Timer myTimer;
        public AnimationResizeHeight(Control control, int interval) {
            this.control = control;
            this.interval = (double)interval;
        }

        public int NewHeight {
            get { return (int)newHeight; }
            set { newHeight = value; }
        }

        private void Start() {
            oldHeight = control.Height;

            myTimer = new System.Timers.Timer(___Einstellungen.sys_animation_tick);//5ms
            myTimer.Elapsed += Evt_TimeEvent;
            myTimer.AutoReset = true;
            myTimer.Enabled = true;
            triggerTime = DateTime.Now;
        }

        public void Start(int newHeight) {
            NewHeight = newHeight;
            Start();
        }

        private void Evt_TimeEvent(Object source, ElapsedEventArgs e) {
            TimeSpan ts = DateTime.Now - triggerTime;
            double val = ts.TotalMilliseconds;

            if(val >= interval) {
                val = interval;
                myTimer.Stop();
            }

            Resize(val);
        }

        private delegate void ResizeDelegate(double time);
        public void Resize(double time) {
            if(control.InvokeRequired) {
                var d = new ResizeDelegate(Resize);
                control.Invoke(d, new object[] { time });
            }
            else {
                //double test = time / interval;
                double h = ((time / interval) * (newHeight - oldHeight)) + oldHeight;

                control.Height = (int)h;
                control.Update();

                if(control.GetType().Equals(typeof(Liste.Liste))) {
                    Liste.Liste liste = (Liste.Liste)control;
                    liste.CallParent();
                }
                else if(control.GetType().Equals(typeof(Liste.ListenElementDetail))) {
                    Liste.Liste liste = (Liste.Liste)control.Parent;
                    liste.ResizeMe(true);
                }
            }
        }
    }

Und wie folgt rufe ich das ganze ab:

animation = new AnimationResizeHeight(this, ___Einstellungen.liste_animation_aufklappen);
animation.Start(newHeight);

Ich hoffe ihr könnt mir da weiter helfen 😃

Liebe Grüße Frokuss

16.806 Beiträge seit 2008
vor 4 Jahren

Das wird allein deswegen in diesert Art nicht flüssiger, weil ein Timer unter Windows nicht besser auflöst als 15 Millisekunden.
Das liegt daran, dass die Windows Clock Rate bei 64 Interupts / Sec liegt und damit bei ca. 15ms auflöst.

Hinzu kommt die Laufzeit bei Deinem Code und das Zeichnen des Fensters.
Du wirst also eher irgendwo bei 50-80ms liegen vermute ich; und das ist eben fürs Auge nicht flüssig.

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 4 Jahren

Ohhh. Damit habe ich nicht gerechnet 😦 Im Kino (35mm) liefen die Projektoren damals mit 24 Bilder / Sekunde (~41ms/Bild)... Die 50 sind dann doch etwas zu viel...

Gibt es denn Möglichkeiten das irgendwie zu umgehen - oder eine alternative?