我试图制作一个触发动画的点击事件。我已经绘制了所有帧并将它们保存为单独的PNG文件(所有帧都是38像素长,56像素宽),但我无法弄清楚如何通过PictureBox运行它们。
我看过很多帖子(这里和其他地方),人们谈论计时器,但我还没有能够弄清楚如何从我的点击事件中调用这些长的例子。或者,我将帧导出为a single animated GIF,但GIF始终循环,我只希望动画播放一次。
以下是我所拥有的:
private void btnStart_Click(object sender, EventArgs e)
{
int delay = 100;
box1.Image = Project.Properties.Resources.frame1;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame2;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame3;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame4;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame5;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame6;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame7;
System.Threading.Thread.Sleep(delay);
box1.Image = Project.Properties.Resources.frame8;
//(and so on)
}
等待大约一秒钟,然后突然切换到最后一帧(本例中为frame8),无论延迟变量是什么。
我可能接近这个完全错误。你们觉得怎么样?
答案 0 :(得分:0)
事件处理程序阻止主线程。 UI在主线程中刷新。
所以,你点击按钮,事件处理程序阻止线程并执行,你所做的任何改变都不会受到影响,直到事件处理程序完成 - 这正是你所经历的。
因此,在按钮单击事件处理程序中,您需要启动进程,但进程本身应位于单独的线程中。最简单的方法是,如果你使用逐帧动画,就是使用定时器。
您需要在计时器中设置间隔,并且在计时器刻度事件中您需要在图片框中加载新图像。您需要通过单独的变量跟踪当前帧索引。如果在内部刻度事件中你意识到它是最后一个图像 - 设置计时器被禁用。在按钮单击事件中重置计时器和帧变量。
答案 1 :(得分:0)
我最终做的是在第一个答案和this video tutorial之后搜索“过程本身应该在单独的线程中”的提示。我做的是放
using System.Threading;
在我的代码开头,放
Thread animationThread;
在所有主要事件之前,放
animationThread = new Thread(back2front_card1);
animationThread.Start();
单击事件中的,并将所有box1.Image和delay命令放入:
public void back2front_card1()
{
}
这完美地运行动画!