65.9K
CodeProject 正在变化。 阅读更多。
Home

WinForms 动画器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (185投票s)

2013年2月19日

LGPL3

4分钟阅读

viewsIcon

227200

downloadIcon

28826

该组件允许您为 WinForms 上的任何控件添加动画效果。

   

引言

 
我们能否让我们的 WinForms 应用程序像 WPF 一样拥有动画效果?是的,当然可以!
Animator 组件允许您为 WinForms 上的任何控件添加动画效果
 

工作原理

 
Animator 在目标控件上方创建一个临时的 DoubleBitmap 控件。DoubleBitmap 包含两个图像。第一个图像是窗体背景的快照,不包含目标控件。第二个图像包含目标控件的快照。

然后,Animator 会周期性地转换 DoubleBitmap 的顶层图像。结果是——我们得到了目标控件的动画模拟。

每次转换都有某种程度的依赖于当前时间。Animator 更改时间并为新的动画帧调用转换。

Animator 支持两种类型的转换——线性转换(缩放、平移、旋转)和非线性转换(扭曲、倾斜等)。它还可以改变动画位图的透明度。

线性变换是使用 GDI+ 的矩阵变换完成的。
旋转变换示例
 

public static void DoRotate(TransfromNeededEventArg e, Animation animation)
{
    var rect = e.ClientRectangle;
    var center = new PointF(rect.Width / 2, rect.Height / 2);
 
    e.Matrix.Translate(center.X, center.Y);
    if (e.CurrentTime > animation.RotateLimit)
        e.Matrix.Rotate(360 * (e.CurrentTime - animation.RotateLimit) * animation.RotateCoeff);
    e.Matrix.Translate(-center.X, -center.Y);
}
 

非线性变换稍微复杂一些。首先,它会创建一个像素数组。然后,在循环中对每个像素进行转换。Animator 可以更改像素的坐标、颜色和透明度。下面是一个变换示例
 

public static void DoBlind(NonLinearTransfromNeededEventArg e, Animation animation)
{
    if (animation.BlindCoeff == PointF.Empty)
        return;
 
    var pixels = e.Pixels;
    var sx = e.ClientRectangle.Width;
    var sy = e.ClientRectangle.Height;
    var s = e.Stride;
    var kx = animation.BlindCoeff.X;
    var ky = animation.BlindCoeff.Y;
    var a = (int)((sx * kx + sy * ky) * (1 - e.CurrentTime));
 
    for (int x = 0; x < sx; x++)
        for (int y = 0; y < sy; y++)
        {
            int i = y * s + x * bytesPerPixel;
            if (x * kx + y * ky >= a)
                pixels[i + 3] = (byte)0;
        }
}
 

Animator 会创建具有正确 z 顺序的 DoubleBitmap。因此,如果某些控件在目标控件下方,它们将位于 DoubleBitmap 控件下方。同样——在目标控件上方的控件也会如此。


如何使用

 
使用 Animator 的最简单方法:将 Animator 组件拖放到您的窗体上。
要启动动画,请从您的代码中调用 Animator.Show(targetControl) 方法。

请注意:在调用 Show 方法之前,目标控件必须被隐藏(visible==false)。否则动画将不会生效。

同样,您可以使用 Animator.Hide(targetControl) 方法来隐藏控件。

Animator 允许您制作可见控件的动画变化。在更新之前,您需要调用 Animator.BeginUpdate(targetControl),然后更新您的控件,最后调用 Animator.EndUpdate(targetControl)。例如

animator.BeginUpdateSync(dataGridView1, true);
dataGridView1[col, row].Value = newValue;
animator.EndUpdate(dataGridView1);
 

结果——控件的外观将随着动画而改变。

Animator 具有几种内置的动画类型。例如 RotateScaleLeafMosaicParticlesBlind 等。您可以通过 AnimationType 属性设置内置动画。

此外,Animator 还允许您微调动画,以及创建自定义动画。
要进行调整,您可以使用 DefaultAnimation 属性。下面描述了 Animation 类所有属性的详细信息。
 

  • PointF SlideCoeff - 设置为 (1,0) 或 (0,1) 以实现滑动效果。
  • float RotateCoeff - 调整旋转角度。
  • float RotateLimit - 参数定义了旋转结束的时间
  • PointF ScaleCoeff - 调整水平和垂直缩放。
  • float LeafCoeff - 设置为 1 以实现“叶子”效果。
  • PointF MosaicCoeff - 调整马赛克偏移。
  • int MosaicSize - 马赛克方块大小(以像素为单位)。
  • PointF MosaicShift - 马赛克方块的偏移。
  • PointF BlindCoeff - 设置为 (1,0) 或 (0,1) 以实现“百叶窗”效果。
  • float TransparencyCoeff - 如果您想制作动画的透明度,请设置为 1。
  • float TimeCoeff - 时间系数。
  • Padding Padding - 扩展 DoubleBitmap 的边界(这对于“宽”动画,如旋转,很有用)。
  • bool AnimateOnlyDifferences - 允许仅为差异动画(仅适用于 AnimationMode.Update)。默认值为 True
 
要创建自定义动画,您需要处理 TransfromNeeded 和/或 NonLinearTransfromNeeded 事件。示例请参见演示应用程序。
 

Animator 拥有一套完善的动画控制技术。每种方法都有异步和同步版本。异步方法启动动画并立即返回。同步方法启动动画并等待动画完成。

此外,Animator 支持动画控件队列。您可以使用 AddToQueue()ClearQueue() 方法进行操作。

此外,Animator 还有等待所有未完成动画的方法和等待特定动画的方法。

此外,Animator 还有 AnimationCompleted AllAnimationsCompleted 事件,它们在任何/所有动画完成后被调用。

扩展控件

该库包含一个扩展的 TabControl。它是一个普通的 TabControl,但它的选项卡具有动画效果。

TabControlEx 包含 Animation 属性,您可以在其中调整选项卡的动画。

演示应用

您可以使用演示应用程序来评估 Animator 的可能性。


装饰示例(底部镜像模式)

限制

Animator 不适用于基于 OLE 的控件(WebBrowser、RichTextBox)。这些控件在窗口不可见时不会自行绘制。因此,我们无法从中获取位图。
 

历史

 
2013 年 2 月 19 日 - 首次发布。
2013 年 2 月 20 日 - 添加了 TabControlExClipRectangle 可用于 Update 模式。
2013 年 2 月 22 日 - 性能有所提高。修复了一些错误。添加了装饰示例。
 

© . All rights reserved.