myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Animation (Height verändern) eines Control optimieren?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Animation (Height verändern) eines Control optimieren?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 156


Frokuss ist offline

Animation (Height verändern) eines Control optimieren?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).

C#-Code:
   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:

C#-Code:
animation = new AnimationResizeHeight(this, ___Einstellungen.liste_animation_aufklappen);
animation.Start(newHeight);

Ich hoffe ihr könnt mir da weiter helfen :-)

Liebe Grüße Frokuss
09.12.2019 15:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.460
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
09.12.2019 16:45 Beiträge des Benutzers | zu Buddylist hinzufügen
Frokuss
myCSharp.de-Mitglied

Dabei seit: 26.08.2015
Beiträge: 156

Themenstarter Thema begonnen von Frokuss

Frokuss ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
09.12.2019 17:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.02.2020 11:54