代码之家  ›  专栏  ›  技术社区  ›  Chris Smith

WinForms中的简单动画

  •  20
  • Chris Smith  · 技术社区  · 16 年前

    假设您想要在WinForm上设置一些对象的动画。设置计时器以更新状态或模型,并重写窗体的绘制事件。但是从那里开始,什么是持续重新绘制动画形式的最佳方法呢?

    • 绘图完成后立即使表单无效?
    • 是否设置第二个计时器并定期使窗体失效?
    • 也许这件事有一个共同的模式?
    • 有什么有用的.NET类可以帮助解决吗?

    每次我需要这样做的时候,我都会发现一种新方法有一个新的缺点。SO社区的经验和建议是什么?

    3 回复  |  直到 16 年前
        1
  •  9
  •   Peteter    13 年前

    在某些情况下,不使用“绘制”事件进行绘制,而是从控件/窗体中获取图形对象并在其上“绘制”会更快更方便。这可能会给不透明度/消除混叠/文本等带来一些麻烦,但从不必重新绘制整个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
  •  46
  •   Caius Jard    16 年前

    我已经创建了一个可以帮助解决这个问题的库。这就是所谓的转换,可以在这里找到: http://code.google.com/p/dot-net-transitions/

    它使用在后台线程上运行的计时器来设置对象的动画。这个库是开放源码的,所以如果它对您有任何用处,您可以查看代码以了解它在做什么。

        3
  •  3
  •   TheSmurf    16 年前

    您所做的是我在WinForms中使用过的唯一解决方案(一个具有恒定重绘的计时器)。有许多技术可以用来让用户的体验更平滑(例如双缓冲)。

    你可能想试试WPF。在WPF中有内置的动画制作工具,与基于计时器的解决方案相比,它们更平滑(并且需要的代码更少,而且不需要同步)。

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

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