我想创建一个动画移动物体..为了移动这个物体我需要更新坐标x和y或其中一个,问题是物体是柱子到最终位置没有平滑移动动画假设...我使用线程睡眠,但不只是让代码冻结然后对象jamb ..这是代码的不工作部分
public void t_Tick(object sender, EventArgs e)
{
if (flag)
{
for (int i = 0; i < 100; i = i + 1)
{
x-position = x-position + 3;
Invalidate();
Thread.Sleep(5000);//instead of stop for 5 second and continue the loop is stop 5 second and go to i=100 the final value in the loop
}
flag = false;
}
}
答案 0 :(得分:1)
问自己这个问题:
我希望我的代码每
t.Interval
毫秒执行一次?
答案是
移动
Control
一次。
因此,只需在t_Tick
方法中移动一次。
您认为我的答案是错误的,因为没有for
循环,但计时器中包含一个循环。在Timer
类中,有一些代码可以做这样的事情:
while (true) {
form1.t_Tick(...);
Thread.Sleep(Interval);
}
注意:这不是Timer
代码中的真实代码,它只是为了解释计时器背后的概念。
它完全按照您希望的方式移动,但是Thread.Sleep()
会阻塞您所在的线程而没有其他任何操作,就像您在该行代码上有一个调试断点一样。因此,可能会调用Invalidate()
,但在您离开for
循环(完全移动时)之前,不会调用重新绘制表单的代码。
答案 1 :(得分:0)
尝试使用Refresh()
代替Invalidate()
来强制立即绘制控件。通过调用Invalidate()
,你基本上只是告诉控件,它的一些部分(或所有部分)需要重新绘制,但现在不要这样做。请注意,这不是一个好方法,因为调用Thread.Sleep
会导致UI线程被阻止。
有关类似问题及其答案,请参阅here,其中使用了更为规范的方式。