Windows フォームの場所をスムーズにアニメーション化しようとしましたが、速度を可変にしたい場合に問題が発生します。つまり、ユーザーがアニメーションの優先速度を選択できるようにしたい場合です。
次の記事を見つけたので、フォームで探していたアニメーションを実行するのにかなり役立ちました。過去に試した BackgroundWorker または Threads アプローチよりもあらゆる点で優れているようです: http://www.vcskicks.com/animated-windows-form.html
私の唯一の問題は、アニメーションの速度を変えたい場合にスムーズなアニメーションを維持することです。私のコードにはFPSとPXという 2 つの重要な値があります。FPS は 1 秒あたりのフレーム数 (その他) を表し、PX はフォームを移動するピクセル数を表します。
問題 1)可能な限りスムーズなアニメーションを実現するには、フォームを一度に 1 ピクセルずつ移動したいのですが、フォームをそのように速く移動できるとは思いません。FPS 値を非常に高い値に上げても効果はないようです。限界があるようで、その限界を超えると目に見える違いはありません。私はそれについての良い説明があると確信しています。
ここでの私の質問は次のとおりです。この問題に対する適切な解決策はありますか、それとも PX 値を変更してフォームを 1 ピクセル以上移動するのが唯一の解決策ですか?
問題 2)上記の質問の解決策がそれに応じて PX 値を変更することである場合、(さまざまな値をテストすることによって) 300 に等しい FPS 値で、フォームを必要なだけゆっくりと速く動かす必要があることがわかりました。それをする。次に、10 の速度が必要な場合は、フォームを 1、2、3、4、5、6、7、8、9、および 10 ピクセルずつ移動すると、必要に応じて低速および高速の滑らかなアニメーションが得られます。たとえば、5 つの速度が必要な場合は、2、4、6、8、10 を使用できます。
ここでの私の質問は次のとおりです: FPS に 300 のような値を使用することに問題はありますか? そのような値に悪い結果はありますか?
そして、ここに私の現在のコードがあります:
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;
}
}
注:これはテスト用の単なるサンプル コードであり、実際のコードではありませんが、これを実際のアプリケーションに移植する際に考慮すべき非常に重要なことを指摘したい場合は、ゲストとしてご利用ください。