首页 > 解决方案 > c# Windows 窗体中的平滑动画

问题描述

我想在图片框中逐帧(逐张)显示动画。我有 42 帧,我想让它变得非常快。我使用了 Timer 组件,但间隔 = 1 毫秒太慢了,我想知道是否有任何方法可以在 c# Windows Forms (Visual Studio) 中制作具有大量帧的快速动画。这就是我现在正在使用的

    Bitmap[] FelixBanner = new Bitmap[50];

    public Form1()
    {
        InitializeComponent();

        for(int i = 1; i <= 42; i++)
            FelixBanner[i] = new Bitmap(@"Photos\Felix\" + i + "FB.bmp");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        timer1.Enabled = true;
    }

    int k = 1;

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (k == 41) 
            timer1.Enabled = false;

        Felix.Image = FelixBanner[k];
        k++;
    }

标签: c#winformsanimation

解决方案


首先,没有一个内置定时器具有 1 ms 的精度。我不会重复或复制粘贴我的旧答案,但请参阅高精度计时器的链接。或者在GitHub 上查看完整的源代码。

其次,使用PictureBox控件进行自定义渲染是一种矫枉过正的做法。除非您使用缩放/拉伸功能,或为其分配动画 GIF,否则您根本不需要它。例如Panel,使用事件以简单的方式渲染动画会更有效。Paint您可以这样做:

private void timer1_Tick(object sender, EventArgs e)
{        
    if (k == 41) 
        timer1.Enabled = false;

    //Felix.Image = FelixBanner[k];
    k++;
    panelAnimation.Invalidate();
}

void panelAnimation_Paint(object sender, PaintEventArgs e)
{
    // make sure "k" is a valid index even after playing the animation because the
    // Paint event might be called whenever your form is resized or has to be repaint
    var image = FelixBanner[k];
    e.Graphics.DrawImage(image, 0, 0, image.Width, image.Height);
}

推荐阅读