J'ai essayé d'animer en douceur certains emplacements Windows Form mais j'ai quelques problèmes si je veux que la vitesse soit variable. En d'autres termes, si je veux permettre à l'utilisateur de sélectionner la vitesse préférée pour l'animation.Comment animer en douceur l'emplacement de Windows Forms à différentes vitesses?
J'ai trouvé l'article suivant qui m'a aidé à réaliser l'animation que je cherchais, pour ma forme. Il semble mieux dans tous les sens qu'une approche BackgroundWorker ou Threads j'ai essayé dans le passé: http://www.vcskicks.com/animated-windows-form.html
Mon seul problème maintenant, est de maintenir une animation fluide si je veux avoir des vitesses différentes pour l'animation. Il y a deux valeurs qui sont importantes dans mon code: FPS et PX. FPS représente les images par seconde (quoi d'autre) et PX représente le nombre de pixels pour déplacer le formulaire. Pour avoir l'animation la plus douce possible, je préférerais que le formulaire bouge 1px à la fois mais je ne pense pas que je serai capable de déplacer le formulaire aussi vite que je le veux. . Augmenter la valeur FPS à une valeur très élevée ne semble pas avoir d'effet, c'est comme s'il y avait une limite et au-dessus de cette limite, il n'y aurait pas de différences visibles. Je suis sûr qu'il y a une bonne explication à cela.
Ma question est la suivante: Avez-vous une bonne solution à ce problème ou la seule solution est de changer la valeur PX et de déplacer le formulaire de plus de 1px si je veux un mouvement plus rapide? Si la solution pour la question ci-dessus est de changer la valeur PX en conséquence, j'ai découvert (en testant différentes valeurs) qu'une valeur FPS égale à 300 suffirait à mon besoin de déplacer le formulaire comme lent et aussi vite que je le veux. Ensuite, si je voulais 10 vitesses, déplacer le formulaire par 1, 2, 3, 4, 5, 6, 7, 8, 9 et 10 pixels fournit des animations lisses et rapides, comme je le veux. Si je voulais 5 vitesses, je pourrais utiliser 2, 4, 6, 8, 10, par exemple.
Ma question ici est: Y at-il un problème à utiliser une valeur de 300 pour FPS? Y a-t-il de mauvaises conséquences pour une telle valeur?
Et voici mon code actuel:
public partial class Form1 : Form {
bool dir = true;
public Form1() {
InitializeComponent();
Location = new Point(1280/2 - Width, 800/2 - Height/2);
}
private void button1_Click(object sender, EventArgs e) {
double FPS = 300;
int PX = 1;
long lastTicks = 0;
long currentTicks = 0;
double interval = (double)Stopwatch.Frequency/FPS;
while(dir ? Left <= 1280/2 : Left >= 1280/2 - Width) {
Application.DoEvents();
currentTicks = Stopwatch.GetTimestamp();
if(currentTicks >= lastTicks + interval) {
lastTicks = Stopwatch.GetTimestamp();
this.Location = new Point(dir ? Left + PX : Left - PX, Top);
this.Invalidate(); //refreshes the form
}
Thread.Sleep(1); //frees up the cpu
}
dir = !dir;
}
}
Note: Ceci est juste un exemple de code, à des fins de test, le code pas réel mais être mon invité si vous voulez signaler certaines choses très importantes que je devrait considérer quand portage ceci à l'application réelle.
La limite devrait être la fréquence de rafraîchissement de votre moniteur: 60Hz pour un TFT typique, qui est effectivement de 60 FPS. – VVS