我一直在嘗試平滑地動畫一些Windows窗體位置,但如果我想讓速度變化,我遇到了一些問題。換句話說,如果我想讓用戶選擇動畫的首選速度。如何平滑地以不同的速度動畫化Windows窗體位置?
我發現以下文章,幫助我執行我正在尋找的動畫,對於我的表單。看起來好像比過去我嘗試過的BackgroundWorker或Threads方法更好: http://www.vcskicks.com/animated-windows-form.html
我現在唯一的問題是如果我想爲動畫提供不同的速度,請保持流暢的動畫。在我的代碼中有兩個重要的值,FPS和PX。 FPS表示每秒幀數(還有什麼),PX表示移動表單的像素數量。
問題1)爲了獲得最平滑的動畫,我寧願讓表單一次移動1px,但我不認爲我能夠像那樣快地移動表單。將FPS值提高到一個非常高的值似乎沒有任何影響,就像有一個限制,超過這個限制,將不會有明顯的差異。我確信有一個很好的解釋。
我在這裏的問題是:你有這個問題的任何好的解決方案或唯一的解決方案是更改PX值,並移動窗體超過1px,如果我想要更快的移動?
問題2)如果上述問題的解決方案是相應地更改PX值,我發現(通過測試不同的值)FPS值等於300就足以滿足我需要將窗體移動爲緩慢並儘可能快地達到我的要求。然後,如果我想要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;
}
}
注:這只是示例代碼,用於測試目的,不是真正的代碼,但如果你想指出一些非常重要的事情是我的客人,我應該考慮將其移植到實際應用程序中。
該限制應該是您的顯示器的刷新率:典型TFT的60Hz,實際上是60 FPS。 – VVS 2009-06-10 20:33:58