我一直在尝试平滑地为某些 Windows 窗体位置设置动画,但如果我希望速度可变,我会遇到一些问题。换句话说,如果我想让用户选择动画的首选速度。
我发现以下文章对我执行我正在寻找的动画有很大帮助,对于我的表单。它似乎在各方面都比我过去尝试过的 BackgroundWorker 或 Threads 方法更好: http ://www.vcskicks.com/animated-windows-form.html
我现在唯一的问题是,如果我想让动画有不同的速度,要保持流畅的动画。我的代码中有两个重要的值,FPS和PX。FPS 表示每秒帧数(还有什么),PX 表示移动表格的像素数。
问题 1)为了获得最流畅的动画,我希望表单一次移动 1px,但我认为我不能像我想要的那样快速移动表单。将 FPS 值增加到一个非常高的值似乎没有任何效果,就像有一个限制,超过该限制,将不会有明显的差异。我确信对此有一个很好的解释。
我的问题是:如果我想要更快的移动,你有什么好的解决方案或者唯一的解决方案是更改 PX 值并将表单移动超过 1px?
问题 2)如果上述问题的解决方案是相应地更改 PX 值,我发现(通过测试不同的值)等于 300 的 FPS 值足以满足我的需要它到。然后,如果我想要 10 种速度,将表单移动 1、2、3、4、5、6、7、8、9 和 10 像素可提供慢速和快速平滑动画,正如我想要的那样。如果我想要 5 种速度,例如,我可以使用 2、4、6、8、10。
我的问题是:将 300 之类的值用于 FPS 有什么问题吗?这样的值有什么不好的后果吗?
这是我当前的代码:
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;
}
}
注意:这只是示例代码,用于测试目的,不是真实代码,如果您想指出一些非常重要的事情,我应该在将其移植到真实应用程序时考虑这些事情。