ToB企服应用市场:ToB评测及商务社交产业平台

标题: 不可不知的WPF动画(Animation) [打印本页]

作者: 诗林    时间: 2024-9-21 18:40
标题: 不可不知的WPF动画(Animation)
在WPF开辟应用中,动画不仅可以引起用户的注意与兴趣,而且还使软件更加便于使用。前面几篇文章解说了画笔(Brush),形状(Shape),几何图形(Geometry),变换(Transform)等相关内容,今天继续解说动画相关内容和知识点,仅供学习分享使用,如有不足之处,还请指正。
 
什么是动画?

 
动画是快速循环播放一系列图像(其中每个图像与下一个图像略微不同)给人造成的一种幻觉。当图像播放速度超过了人眼识别的速度,就会感觉这些图像形成了一个连贯的变化的场景。在影戏中,摄像机每秒钟拍摄很多照片(每一张成为一帧),便可给人造成这种错觉。不同的帧速率会影响视频的流畅度和清晰度。常见的帧速率包括24帧/秒、25帧/秒、30帧/秒等,这些速率各有其实用场景和特点:
虽然理论上高帧速率(如100帧/秒甚至更高)能提供更流畅的画面,但在现实拍摄中,高帧速率的采用受到设备能力、存储空间和后期处置惩罚成本的限定。因此,在选择帧速率时,需要综合考虑技能可行性、艺术效果和成本等因素。
 
属性动画系统

 
在WPF中,通过对对象的个别属性应用动画,可以使控件产生动画效果。如:若要使UI元素变大缩小,可以对其Width和Height属性进行动画处置惩罚;若要使UI对象从视野中消失或出现,可以对Opacity属性进行动画处置惩罚。若要使属性具有动画功能,属性必须满意以下三个要求:
由于UIElement类实现IAnimatable接口,而FramworkElement又派生自UIElement,以是大部门的UI控件都包罗IAnimatable属性的对象。如Button,TabControl,Panel和Shape等,且大多数属性都是依赖属性。
 
属性动画

 
如果要实现一个Rectangle元素从视野中渐渐消失,然后再次出现,并循环播放,应该怎么实现呢?
属性动画完备示比方下所示:
  1. <StackPanel Margin="10">
  2.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  3.         <Rectangle.Triggers>
  4.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  5.                 <BeginStoryboard>
  6.                     <Storyboard>
  7.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  8.                                          From="1.0" To="0.0" Duration="0:0:5"
  9.                                          AutoReverse="True" RepeatBehavior="Forever" />
  10.                     </Storyboard>
  11.                 </BeginStoryboard>
  12.             </EventTrigger>
  13.         </Rectangle.Triggers>
  14.     </Rectangle>
  15. </StackPanel>
复制代码
上述代码在C#中实现,如下所示:
  1. StackPanel panel = new StackPanel();
  2. panel.Margin = new Thickness(10);
  3. Rectangle rectangle = new Rectangle();
  4. rectangle.Name = "rectangle";
  5. this.RegisterName(rectangle.Name, rectangle);
  6. rectangle.Width = 100;
  7. rectangle.Height = 100;
  8. rectangle.Fill = Brushes.Blue;
  9. DoubleAnimation animation = new DoubleAnimation();
  10. animation.From = 1.0;
  11. animation.To = 0.0;
  12. animation.Duration = new Duration(TimeSpan.FromSeconds(5));
  13. animation.AutoReverse = true;
  14. animation.RepeatBehavior = RepeatBehavior.Forever;
  15. var storyboard = new Storyboard();
  16. storyboard.Children.Add(animation);
  17. Storyboard.SetTargetName(animation, rectangle.Name);
  18. Storyboard.SetTargetProperty(animation, new PropertyPath(Rectangle.OpacityProperty));
  19. rectangle.Loaded += new RoutedEventHandler((sender,e) =>{
  20.     storyboard.Begin(this);
  21. });
  22. panel.Children.Add(rectangle);
  23. this.Content = panel;
复制代码
 
动画类型

 
不同的属性值具有不同的动画类型,如果是double类型的属性(如:width,height,opacity等)进行动画处置惩罚,则可以使用双精度动画(DoubleAntmation);如果是Point类似的属性,则可以使用Point动画(PonitAnimation);如果是颜色类型的属性,则可以使用ColorAnitmation。这些类型的动画位于System.Windows.Media.Animation定名空间,且都遵循“Animation”格式的定名约定。具体如下所示:
下表显示了一些常用动画类型以及一些与这些类型一起使用的属性。
属性类型对应的根本动画对应的关键帧动画对应的路径动画示例
ColorColorAnimationColorAnimationUsingKeyFrames对 SolidColorBrush 或 GradientStop 的 Color 进行动画处置惩罚。
DoubleDoubleAnimationDoubleAnimationUsingKeyFramesDoubleAnimationUsingPath对 DockPanel 的 Width 或 Button 的 Height 进行动画处置惩罚。
PointPointAnimationPointAnimationUsingKeyFramesPointAnimationUsingPath对 EllipseGeometry 的 Center 位置进行动画处置惩罚。
StringStringAnimationUsingKeyFrames对 TextBlock 的 Text 或 Button 的 Content 进行动画处置惩罚。
     
 
时间线

全部的动画类型均继承自Timeline类。以是全部的动画都是专用类型的时间线。Timeline定义一个时间段,通过Timeline的相关属性,可以指定时间线的计时方式,三个经常使用的计时属性分别为Duration,AutoReverse,和RepeatBehavior。
 
关键帧动画

 
与From/To/By动画类似,关键帧动画对目标类型的属性进行动画处置惩罚。它通过Duration值属性在目标值之间创建过渡。但是From/To/By动画可以在两个值之间创建过渡,而单个关键帧动画则可以在恣意数量的目标值之间创建过渡。关键帧动画没有设置其目标值所需要的From,To,By属性。关键帧动画的目标值使用关键帧对象进行定义,因此称之为“关键帧动画”。动画启动后,在各个关键帧之间进行过渡。
关键帧动画创建步骤:
以下示例使用 DoubleAnimationUsingKeyFrames 对 Rectangle 元素进行四个不同位置的动画处置惩罚。
  1. <StackPanel Margin="10">
  2.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  3.         <Rectangle.Triggers>
  4.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  5.                 <BeginStoryboard>
  6.                     <Storyboard>
  7.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  8.                                          From="1.0" To="0.0" Duration="0:0:5"
  9.                                          AutoReverse="True" RepeatBehavior="Forever" />
  10.                     </Storyboard>
  11.                 </BeginStoryboard>
  12.             </EventTrigger>
  13.         </Rectangle.Triggers>
  14.     </Rectangle>
  15. </StackPanel><StackPanel Margin="10">
  16.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  17.         <Rectangle.Triggers>
  18.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  19.                 <BeginStoryboard>
  20.                     <Storyboard>
  21.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  22.                                          From="1.0" To="0.0" Duration="0:0:5"
  23.                                          AutoReverse="True" RepeatBehavior="Forever" />
  24.                     </Storyboard>
  25.                 </BeginStoryboard>
  26.             </EventTrigger>
  27.         </Rectangle.Triggers>
  28.     </Rectangle>
  29. </StackPanel>                    
复制代码
关键帧动画类位于System.Windows.Media.Animation定名空间,且都遵循“AnimationUsingKeyFrames”格式的定名约定。关键帧动画支持三种不同的插值类型,因此关键帧定义格式遵循如下规则“KeyFrame”,其中  是关键帧使用的内插方法, 是类进行动画处置惩罚的值的类型。 比方,可以针对 DoubleAnimationUsingKeyFrames 使用三种关键帧类型:DiscreteDoubleKeyFrame(离散内插关键帧)、LinearDoubleKeyFrame(线性内插关键帧) 和 SplineDoubleKeyFrame(曲线内插关键帧)。
关键帧的主要目的是定义KeyTime和Value值。
关键帧动画开始后,会按关键帧的 KeyTime 属性定义的序次来循环访问其关键帧。
注意:KeyTime指定方式可以是“小时:分钟:秒”的Timespan方式,也可以是百分比方式(该值必须大于或等于 0 并且小于或等于 100%)。
 
路径动画

 
路径动画是一种使用PathGeometry作为输入的动画时间线(AnimationTimeline),可以定义一个几何路径并使用它来设置路径动画的PathGeometry属性,而不是使用From,To,By属性或使用关键帧。路径动画运行时,会从路径中读取x,y和角度信息并使用该信息天生其输出。路径动画对沿着复杂路径的对象进行动画处置惩罚非常有用。不同的属性值类型,对应不同的路径动画类型。
路径动画类属于 System.Windows.Media.Animation 定名空间,并使用以下定名约定:
AnimationUsingPath
其中  为该类进行动画处置惩罚的值的类型。常见的路径动画如下表所示:
属性类型相应的路径动画阐明
DoubleDoubleAnimationUsingPath沿着路径进行动画处置惩罚(双重动画)
MatrixMatrixAnimationUsingPath沿着路径进行动画处置惩罚(矩阵动画)
PointPointAnimationUsingPath沿着路径进行动画处置惩罚(点动画)
路径动画阐明:
以下路径动画演示了MatrixAnimationUsingPath 的使用方式:
  1. <StackPanel Margin="10">
  2.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  3.         <Rectangle.Triggers>
  4.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  5.                 <BeginStoryboard>
  6.                     <Storyboard>
  7.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  8.                                          From="1.0" To="0.0" Duration="0:0:5"
  9.                                          AutoReverse="True" RepeatBehavior="Forever" />
  10.                     </Storyboard>
  11.                 </BeginStoryboard>
  12.             </EventTrigger>
  13.         </Rectangle.Triggers>
  14.     </Rectangle>
  15. </StackPanel><StackPanel Margin="10">
  16.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  17.         <Rectangle.Triggers>
  18.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  19.                 <BeginStoryboard>
  20.                     <Storyboard>
  21.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  22.                                          From="1.0" To="0.0" Duration="0:0:5"
  23.                                          AutoReverse="True" RepeatBehavior="Forever" />
  24.                     </Storyboard>
  25.                 </BeginStoryboard>
  26.             </EventTrigger>
  27.         </Rectangle.Triggers>
  28.     </Rectangle>
  29. </StackPanel><StackPanel Margin="10">
  30.     <Rectangle Name="MyRectangle" Width="100" Height="100" Fill="Blue">
  31.         <Rectangle.Triggers>
  32.             <EventTrigger RoutedEvent="Rectangle.Loaded">
  33.                 <BeginStoryboard>
  34.                     <Storyboard>
  35.                         <DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
  36.                                          From="1.0" To="0.0" Duration="0:0:5"
  37.                                          AutoReverse="True" RepeatBehavior="Forever" />
  38.                     </Storyboard>
  39.                 </BeginStoryboard>
  40.             </EventTrigger>
  41.         </Rectangle.Triggers>
  42.     </Rectangle>
  43. </StackPanel>            
复制代码
关于动画相关内容,可参考官方文档:
https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/graphics-multimedia/animation-overview?view=netframeworkdesktop-4.8
以上就是《不可不知的WPF动画(Animation)》的全部内容,希望可以抛砖引玉,一起学习,共同进步!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4