2014-02-15 62 views
2

我有一个程序,可以随意移动图片框中的gif,但是当函数被调用时,gif会冻结。但是,当我使用keyDown函数移动框来移动图片框时,它仍然是动画的。如何在移动时保持动画效果?如何在不暂停的情况下移动动画GIF?

这是我用它来移动一个随机距离,冻结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?

回答

4

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

或者,您可以拨打Application.DoEvents methodThread.Sleep,但这是一种不好的做法。

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(); 
} 
相关问题