WinForms 动画器






4.96/5 (185投票s)
该组件允许您为 WinForms 上的任何控件添加动画效果。



引言
我们能否让我们的 WinForms 应用程序像 WPF 一样拥有动画效果?是的,当然可以!Animator
组件允许您为 WinForms 上的任何控件添加动画效果。
工作原理
Animator 在目标控件上方创建一个临时的 DoubleBitmap
控件。DoubleBitmap
包含两个图像。第一个图像是窗体背景的快照,不包含目标控件。第二个图像包含目标控件的快照。
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
具有几种内置的动画类型。例如 Rotate
、Scale
、Leaf
、Mosaic
、Particles
、Blind
等。您可以通过 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 日 - 添加了 TabControlEx
,ClipRectangle
可用于 Update 模式。
2013 年 2 月 22 日 - 性能有所提高。修复了一些错误。添加了装饰示例。