动画在c#中使用几个png
本文关键字:几个 png 动画 | 更新日期: 2023-09-27 18:09:38
我想做一个触发动画的点击事件。我已经绘制了所有帧并将它们保存为单独的PNG文件(它们都是38像素长,56像素宽),但我不知道如何通过PictureBox运行它们。
我看了很多人们谈论计时器的帖子(这里和其他地方),但我还没能弄清楚如何调用我的点击事件中的任何这些长例子。或者,我将帧导出为单个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)。
我可能完全错了。你们怎么看?
事件处理器阻塞主线程。在主线程中刷新UI。
所以,你点击按钮,事件处理程序阻塞线程并执行,无论你改变什么都不会影响UI,直到事件处理程序完成-这正是你所经历的。
所以在你的按钮点击事件处理程序中,你需要启动进程,但进程本身应该在单独的线程中。如果使用逐帧动画,最简单的方法是使用计时器。你需要在计时器中设置间隔,在计时器滴答事件中你需要在图片框中加载新图像。您需要通过单独的变量跟踪当前帧索引。如果在tick事件中你意识到它是最后一个图像设置定时器被禁用。重置按钮点击事件中的计时器和帧变量
我最终在第一个答案中搜索了"进程本身应该在单独的线程中"的提示,并跟随了这个视频教程。我所做的就是把
using System.Threading;
在我代码的开头,放上
Thread animationThread;
在所有主要事件之前,放置
animationThread = new Thread(back2front_card1);
animationThread.Start();
中的点击事件,并把所有的盒子1。图像和延迟命令:
public void back2front_card1()
{
}
这将完美地运行动画!