我有一个程序可以在随机方向移动图片框中的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的情况下将照片框移动到随机距离?
答案 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();
}