Animație simplă în WinForms

Imaginați-vă că doriți să animați un obiect pe un WinForm. Setați un cronometru pentru a actualiza starea sau modelul și pentru a înlocui evenimentul de vopsea al Formularului. Dar de acolo, care este cel mai bun mod de a repara continuu Formularul pentru animație?

  • Anulați formularul imediat ce ați terminat desenul?
  • Setează un al doilea cronometru și invalidează formularul la un interval regulat?
  • Poate că există un model comun pentru acest lucru?
  • Există clase .NET utile care să vă ajute?

De fiecare dată când trebuie să fac asta, descopăr o nouă metodă cu un nou dezavantaj. Care sunt experiențele și recomandările comunității SO?

0
fr hi bn

3 răspunsuri

În unele situații, este mai rapid și mai convenabil să nu desenezi folosind evenimentul vopselei, ci să obții obiectul Grafica din control/formă și să pictezi "pe" asta. Acest lucru poate da unele probleme cu opacitate/anti alias/text, etc, dar ar putea fi în valoare de probleme în ceea ce privește nu trebuie să repaint întregul shabang. Ceva în felul următor:

private void AnimationTimer_Tick(object sender, EventArgs args)
{
   //First paint background, like Clear(Control.Background), or by
   //painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

Folosesc acest lucru în unele Controls eu și am buffered imagini pentru a "clar" fundal cu, atunci când obiectul de interes se mișcă sau trebuie să fie eliminate.

0
adăugat
Pun pariu ca este! Nu i-am folosit niciodată.
adăugat autor Peteter, sursa
Nu este mai bine făcută cu clasa BufferedGraphics?
adăugat autor Ivan Ičin, sursa

Ce faci este singura soluție pe care am folosit-o vreodată în WinForms (un cronometru cu redrawings constantă). Există o grămadă de tehnici pe care le puteți utiliza pentru a face experiența utilizatorului cu acesta mai ușoară (cum ar fi dublu-buffering).

S-ar putea să doriți să încercați WPF. Există facilități încorporate pentru a face animații în wpf și sunt mult mai neted (și necesită mai puțin cod și fără sincronizare din partea dvs.) decât o soluție bazată pe cronometru.

Rețineți că nu aveți nevoie să utilizați wpf în întreaga aplicație pentru soluția respectivă; este posibil să împachetați această funcție într-un control wpf și să încorporați controlul într-o aplicație WinForms (sau o aplicație neangajată, de pildă):

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

0
adăugat

I've created a library that might help with this. It's called Transitions, and can be found here: http://code.google.com/p/dot-net-transitions/

Utilizează cronometrele care rulează pe un fir de fundal pentru a anima obiectele. Biblioteca este open-source, așa că dacă este folositoare pentru tine, poți să te uiți la cod pentru a vedea ce face.

0
adăugat
Minunat bibliotecă, îmi place. Îmi amintește de JQuery.UI
adăugat autor Malfist, sursa
De ce nu este asta pe Nuget!
adăugat autor The Muffin Man, sursa
Bibliotecă minunată. Foarte bine făcut și lucrează grozav.
adăugat autor Ryan Farley, sursa
Buna treaba !! Mi-a plăcut.
adăugat autor Sujith H S, sursa