想象一下,你想在WinForm上设置一些对象的动画。您设置计时器以更新状态或模型,并覆盖窗体的绘制事件。但是从那里开始,不断重新绘制动画形式的最佳方法是什么?
每次我需要这样做时,我发现了一种带有新缺点的新方法。 SO社区的经验和建议是什么?
答案 0 :(得分:47)
我已经创建了一个可能对此有帮助的库。它叫做Transitions,可以在这里找到:http://code.google.com/p/dot-net-transitions/
它使用在后台线程上运行的计时器来为对象设置动画。该库是开源的,因此如果对您有用,您可以查看代码以了解它正在做什么。
答案 1 :(得分:10)
在某些情况下,不使用paint事件绘制更快更方便,但是从控件/表单中获取Graphics对象并在其上绘制“on”。这可能会给不透明/抗锯齿/文本等带来一些麻烦,但是在不必重新绘制整个shabang方面可能是值得的。有点像:
private void AnimationTimer_Tick(object sender, EventArgs args)
{
// First paint background, like Clear(Control.Background), or by
// painting an image you have previously buffered that was the background.
animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++]));
}
我自己在一些控件中使用它,并且当感兴趣的物体移动或需要被移除时,缓冲图像以“清除”背景。
答案 2 :(得分:4)
你所做的是我在WinForms中使用的唯一解决方案(具有不断重绘的计时器)。您可以使用许多技术使用户的体验更顺畅(例如双缓冲)。
您可能想尝试WPF。有一些内置的工具可以在WPF中进行动画制作,与基于计时器的解决方案相比,它们更加流畅(并且需要更少的代码而且没有同步)。
请注意,您不需要在整个应用程序中使用WPF来获得该解决方案;可以将此功能打包到WPF控件中并将控件嵌入WinForms应用程序(或非托管应用程序):