关于.net:WinForms中的简单动画

关于.net:WinForms中的简单动画

Simple animation in WinForms

假设您要为WinForm上的某些对象设置动画。 您设置了一个计时器来更新状态或模型,并覆盖窗体的绘制事件。 但是从那里开始,为动画连续重新绘制窗体的最佳方法是什么?

  • 完成绘制后,使表单失效吗?
  • 设置第二个计时器并定期使表格无效?
  • 也许这件事有一个共同的模式?
  • 是否有有用的.NET类来提供帮助?

每次我需要这样做时,我都会发现具有新缺点的新方法。 SO社区有哪些经验和建议?


我创建了一个库可能对此有所帮助。它称为过渡,可以在以下位置找到:https://github.com/UweKeim/dot-net-transitions。在nuget上作为dot-net-transitions包提供

它使用在后台线程上运行的计时器为对象设置动画。该库是开源的,因此,如果对您有用,则可以查看代码以查看其作用。


在某些情况下,不使用paint事件进行绘制,而是从控件/窗体获取Graphics对象并在其上进行绘制,这样会更快,更方便。这可能会给不透明度/反锯齿/文本等带来一些麻烦,但是在不必重新绘制整个shabang方面值得考虑。类似于以下内容:

1
2
3
4
5
6
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++]));
}

我本人在某些控件中使用了此控件,并在感兴趣的对象移动或需要删除时缓冲了图像以"清除"背景。


您正在做的事情是我在WinForms(具有不断重绘的计时器)中使用过的唯一解决方案。您可以使用多种技术使用户的使用体验更加流畅(例如双缓冲)。

您可能想尝试一下WPF。有内置的功能可以在WPF中制作动画,它们比基于计时器的解决方案更流畅(并且需要更少的代码,并且不需要同步)。

请注意,对于该解决方案,您无需在整个应用程序中使用WPF;可以将此功能打包到WPF控件中,然后将该控件嵌入WinForms应用程序(或非托管应用程序)中:

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx


推荐阅读