如何在不停顿的情况下移动GIF​​动画?

时间:2014-02-15 04:15:46

标签: c# .net winforms animated-gif

我有一个程序可以在随机方向移动图片框中的gif,但是当调用该函数时,gif会冻结。但是,当我使用keyDown函数移动框来移动图片框时,它仍然是动画。如何让它在移动时保持动画效果?

这是我以前用它移动一个随机距离,冻结了gif。

void Form1_KeyDown(object sender, KeyEventArgs e)
{        
    if (e.KeyCode == Keys.A)
    {
        eventDuration = randomizer.Next(30, 70);
        while (eventDuration != 0)
        {
            MoveLeft();
            eventDuration = eventDuration - 1;
            Thread.Sleep(15);
        }
    }
}

private void MoveLeft()
{
    _y = picPicture.Location.Y;
    _x = picPicture.Location.X;
    picPicture.Location = new System.Drawing.Point(_x - 1, _y);
}

然而,如果使用它,它会平滑移动而不会冻结gif,即使我按住A键也是如此。我不能使用这种方法,因为它需要不断的用户输入,而第一种方法是自动移动

void Form1_KeyDown(object sender, KeyEventArgs e)
{        
    if (e.KeyCode == Keys.A)
    {
        MoveLeft();
    }
}

private void MoveLeft()
{
    _y = picPicture.Location.Y;
    _x = picPicture.Location.X;
    picPicture.Location = new System.Drawing.Point(_x - 1, _y);
}

如何在不暂停gif的情况下将照片框移动到随机距离?

2 个答案:

答案 0 :(得分:3)

如果您使用Thread.Sleep,您的应用程序不会处理任何窗口事件,包括重绘。正确的方法是使用Timer class。当按下 A 键时,您应该启用计时器并在其Tick事件中移动控件。

或者,您可以在Thread.Sleep之后致电Application.DoEvents method,但这是一种不好的做法。

答案 1 :(得分:0)

要在移动时为GIF设置动画,可以在KeyDown()方法上启动计时器,并在每个Tick上调用MoveLeft()方法。当您想要停止动画时,只需按另一个键即可停止计时器。通过这种方式,您可以在移动过程中以及静止时实现动画。

private Timer _timer = new Timer();

_timer.Interval = 10; // miliseconds

void Form1_KeyDown(object sender, KeyEventArgs e)
{        
    if (e.KeyCode == Keys.A)
    {
        _timer.Start();
    }
    if (e.KeyCode == "KEY_FOR_STOPPING_ANIMATION")
    {
        _timer.Stop();
    }
}

void timer1_Tick(object sender, EventArgs e)
{
    MoveLeft();
}