动画在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)。

我可能完全错了。你们怎么看?

动画在c#中使用几个png

事件处理器阻塞主线程。在主线程中刷新UI。

所以,你点击按钮,事件处理程序阻塞线程并执行,无论你改变什么都不会影响UI,直到事件处理程序完成-这正是你所经历的。

所以在你的按钮点击事件处理程序中,你需要启动进程,但进程本身应该在单独的线程中。如果使用逐帧动画,最简单的方法是使用计时器。

你需要在计时器中设置间隔,在计时器滴答事件中你需要在图片框中加载新图像。您需要通过单独的变量跟踪当前帧索引。如果在tick事件中你意识到它是最后一个图像设置定时器被禁用。重置按钮点击事件中的计时器和帧变量

我最终在第一个答案中搜索了"进程本身应该在单独的线程中"的提示,并跟随了这个视频教程。我所做的就是把

using System.Threading;

在我代码的开头,放上

Thread animationThread;

在所有主要事件之前,放置

animationThread = new Thread(back2front_card1);
animationThread.Start();

中的点击事件,并把所有的盒子1。图像和延迟命令:

public void back2front_card1()
{
}

这将完美地运行动画!