我是靠谱客的博主 魁梧冷风,最近开发中收集的这篇文章主要介绍WPF三大常用动画,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(1)WPF动画【线性插值&关键帧&路径】:
1、动画有两种类型:①Animation线性插值动画:在开始值与结束值之间以逐步增加的方式改变属性的动画。②AnimationUsingKeyFrames关键帧动画:从一个值突然变成另一值的动画,所有关键帧动画都使用"类型名 + AnimationUsingKeyFrames"的形式命名。③AnimationUsingPath路径动画:基于路径而创作的动画。

2、动画的构成:布局控件 - 事件触发器【Trigger】 - 开始播放故事板【BeginStoryboard】 - 故事板【Storyboard】 - 动画【Animation】。

3、Storyboard故事板:动画的基本单元,控制动画的播放、暂停、停止等基础操作,需要指定TargetName&TargetProperty这两个属性。

4、事件触发器:通过事件触发器来播放BeginStoryboard故事板的动画。

5、动画执行的两种方式:①通过设定触发器事件在页面执行动画。②后台托管执行动画。

6、Animation线性插值动画:①它提供一种简单的“渐变”动画,我们为一个Animation指定开始值与结束值,并指定由开始值到达结束值的所需时间,便可形成一个简单的动画。②Animation支持两种属性的动画效果:DoubleAnimation属于Double类型的属性都可以使用它产生的线性插值动画;ColorAnimation作用于属性为Color类型对象的线性插值动画,用于改变对象的填充颜色。③Animation动画设置属性,如下图:
在这里插入图片描述
7、AnimationUsingKeyFrames关键帧动画:①特点:它可以根据目标属性值之间的差异产生各种动画效果,一个关键帧动画可以在任意多个目标属性值之间进行渐变,它能产生更多更复杂的动画效果。②AnimationUsingKeyFrames支持两种属性动画:DoubleAnimationUsingKeyFrames(Double类型属性的关键帧动画)、ColorAnimationUsingKeyFrames(Color类型属性的关键帧动画)。
③关键帧与线性插值之间的区别:线性插值动画可以通过设置From、To这两个值就能制作出动画的演变过程,但关键帧动画不能使用From、To属性,若是需要定义关键帧动画的演变过程,就需要去设置多个关键帧动画,并通过KeyTime来定义演变的时间,0.5秒是由黄色变为绿色,1秒的时候从绿色又变成蓝色,Value可以设置属性值。

8、C#后台创建线性插值动画:先在页面定义承载控件,From属性元素开始值,To属性元素结束值,Duration整个动画的执行时间。即使不使用To属性,也可以使用By属性,By值被简单地增加到From值上,使其达到To值,但对于非数值数据类型来说,By属性是没有意义的。以下为C#代码:
//实例化DoubleAnimation类
DoubleAnimation doubleAnimation = new DoubleAnimation();
//设置From属性(btn1为页面按钮的Name)
doubleAnimation.From = btn1.Width;
//设置To属性
doubleAnimation.To = 250;
//设置Duration属性
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
//为元素设置BeginAnimation方法
btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);

9、动画的生命周期:①注意,动画并不能真正的改变属性的值,当动画处于执行状态时,动画改变的值只是覆盖掉了元素原有的值。②为了能让动画完成后能修改属性的值,有两种方法可以解决:设置AutoReverse属性,将该属性设置为true,将会反向运动,将元素属性返回到原始的值(不适合用于动画完成后,它只为还原动画执行之前的值);改变FillBehavior属性,FillBehavior属性默认设置为HoldEnd,意味着当动画结束时会继续为目标元素应用最后的值,如果将FillBehavior的属性改为Stop,那么,动画一旦结束,属性就会恢复为原来的值(适用于动画结束后,再次为其设置新值)。这两种属性一般不结合使用,只要用到其中的一个就能成功改变动画的生命周期问题。

10、动画的Completed事件:使用该事件时,要将事件设置在BeginAnimation()方法之前,否则将不起作用。在Completed中,可通过调用BeginAnimation()方法来渲染不活动的动画,只需要指定属性,并为动画对象传递null引用便可。

11、TimeLine类:①用于控制动画的执行速度,加快或减缓动画播放的速度,动画暂停、重复等。②该类有七种常用属性:BeginTime设置将被添加到动画开始之前的延时时间(TimeSpan类型),此延时会被加载到总时间,设置了5秒延时的5秒动画,总时长为10秒;Duration设置动画开始到结束的运行时间;SpeedRatio提高或减慢动画速度,SpeedRatio默认的属性值是1,如果增加该属性值为5,那么动画的速度就会变成原来的5倍;AcclerationRatio&DecelerationRatio让动画不是线性【即均速状态】的,从开始时较慢,或开始时较快,这两个属性的值都在0~1之间,这两个属性值之和不能超过1;AutoReverse如果为true,当动画完成时会自动反向播放,返回到动画执行前的原始值;FillBehavior定义动画结束时的操作;RepeatBehavior通过该属性能指定动画的执行次数或时间间隔重复动画,用于设置该属性的RepeatBehavior对象决定了确切的行为。

12、AccelerationRatio与DecelerationRatio属性:使用这两个属性压缩部分时间轴,使动画运行更快,并将拉伸其他时间进行补偿,使总时间保持不变,这两个属性都表示百分比值,例如:将在1个10秒的动画中,将AccelerationRatio属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加速,前3秒加速运行,将DecelerationRatio属性设置为0.3,那么最后3秒则减速运行,而剩余的4秒则会以恒定不变的速度运行。

13、RepeatBehavior属性:控制如何重复运行动画,如果希望重复固定次数,那就要为该属性构造函数传递合适的次数,还可设置它为永久重复,将重复动画的执行代码放在实例化动画代码的后一步位置执行最为合适。

14、故事板&事件触发器:①通过故事板可以将动画指定到合适的元素和属性,事件触发器则用于相应属性的变化或事件,并控制着故事板。②故事板用来分组多个动画,而且具有控制动画播放的能力,如:暂停、停止以及播放指定位置,然而Storyboard类提供的最基本功能是能使用TargetProperty和TargetName这两个附加属性去指向某个特定属性和特定元素,它在动画和希望应用动画的属性之间架起了一座桥梁。③创建事件触发器时,要指定开始触发器的路由事件和触发器需要执行的一个或多个动作。对于动画而言,最常用的动作是定义BeginStoryboard,该动作相当于调用BeginAnimation()方法,要知道的是:所有事件触发器都可以启动动作。可以定义事件触发器的位置:在样式中(Style.Triggers集合)、
在数据模板中(DataTemplate.Triggers集合)、在控件模板中(ControlTemplate.Triggers集合)、直接在元素中定义事件触发器(FrameworkElement.Triggers集合)。

15、控制播放【此类属性控制的不是动画本身,控制的是故事板】:①BeginStoryboard加载动画。②PauseStoryboard停止播放动画并保持当前位置。③ResumeStoryboard恢复或暂停动画的播放。④StopStoryboard停止播放的动画,动画被停止后属性将恢复到动画开始阶段。⑤SeekStoryboard改变整个故事板的SpeedRatio属性值。⑥SkipStoryboardToFill将故事板移动到动画执行时间的终点。若FillBehavior属性设置为HoldEnd,动画将继续保持着最后的值。⑦RemoveStoryboard移除故事板,停止所有正在运行的动画,并将属性返回为原来的(最后一次)设置的数值。⑧注意:如果要成功地执行这些动作,必须在同一个Triggers触发器集合中定义所有的动作,如果将两个不同的动作放置到不同的集合中,那么动作将无法完成。

16、故事板监听事件:①Completed:动画已经到达了终点。②CurrentGlobalSpeedInvalidated:速度发生了变化,或动画被暂停、重新开始、停止或移到某个新的位置。③CurrentStateInvalidated:动画已经开始或结束。
④CurrentTimeInvalidated:动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、停止或结束时也会引发该事件。⑤RemoveRequested动画正在被移除。

17、动画缓动:①线性动画有个缺点,让人感觉机械且不够自然,要想改进动画并创建出更趋自然的动画,秘诀是改变变化的速率【提高帧率】。设计根据某种方式加速或减速的动画,实现更趋自然的动画,最简单方法是使用预置的缓动函数EasingFunction。但是该缓动函数EasingFunction只能接受单个缓动函数对象,所以不能为同一个动画结合不同的缓动函数【缺点】。②EasingMode属性有三种值,分别是:EaseIn(在动画开始时应用缓动效果)、EaseOut(动画结束时应用缓动效果)和EaseInOut(在开始和结束时应用缓动动画)。注意!应用缓动函数时并不会改变动画的持续时间。③常用的缓动函数类:BackEase【EaseIn模式应用该缓动函数时,在动画开始之前拉回动画,EaseOut模式时,允许动画稍微超越然后再拉回(Amplitude属性决定拉回和超越的量,默认值是1,可减小该属性值以缩减效果,或增加该属性值放大效果】;ElasticEase【EaseOut模式应用该缓动函数时,使动画超越其最大值并前后摆动,然后逐渐减慢。EaseIn模式时,动画在其开始值周围前后摆动,然后逐渐增加(动画前后摆动的次数由属性Oscillations控制)】;BounceEase【与Elastic效果类似,只是弹跳永远不会超越初始值或最终值(Bounce属性控制动画回调的次数,默认值是2)】;CircleEase【圆函数加速(EaseIn模式),或减速(EaseOut模式)】;CublicEase
【使用基于时间立方的函数加速,其效果与Circle类似,但加速效果更缓和】。QuadraticEase【用基于时间平方的函数加速,效果与CublicEase类似,但加速过程更明显】。

18、自定义缓动函数:新建一个类,让其继承自EasingFunctionBase类,重写EaseInCore()方法和CreateInstanceCore()方法,定义依赖属性,然后引用。

19、WPF动画的性能与帧率:在页面同时发生多个动画的情况下,这时候更需要关注动画的执行性能,WPF默认保持以60帧/秒的速度进行动画,可以确保从开始到结束得到平滑流畅的动画。帧速率越低,越容易发生抖动【卡顿】现象。帧速率越高,占用的CPU也就越高,可以通过TimeLine.DesiredFrameRate属性对帧率进行调整。找VS菜单栏中的调试,再找到窗口选项,然后点击诊断工具,通过诊断工具可以看到当前软件运行时所占用的CPU。

(2)WPF高级动画【动态变换】:
1、变换提供了自定义元素的最强大方式之一,每个元素都能以两种不同的方式使用变换。

2、RenderTransform和LayoutTransform属性:RenderTransform属性效率更高,因为是在布局之后应用变换,并且用于变换最终的渲染输出。LayoutTransform则是在布局之前应用,从而其他控件需要重新排列以适应变换,效率也就低些。

3、动态改变多个变换:在属性标签中可以放置多个变换【旋转、缩放…】。

4、动态改变画刷:ColorAnimation改变颜色,PointAnimation改变线性渐变的坐标。

5、DoubleAnimation改变数值、ColorAnimation改变颜色、PointAnimation改变坐标。

6、关键帧动画【平滑型】:线性关键帧类通常使用"Linear"+数据类型+KeyFrame"的形式进行命名,如果需要创建具有多个分段的动画和不规则移动的动画,这个时候可以使用关键帧动画,它是由许多较短的段构成的动画,每段表示动画的初始值、最终值或中间值,当运行动画时,它平滑地从一个值移动到另一个值;关键帧对象基本上都有Value属性和KeyTime属性,关键帧对象的Value属性的数据类型和其他普通动画不同,在LinearPointKeyFrame类中是Point类型,在DoubleKeyFrame类中则是double类型。

7、【离散型】的关键帧动画:离散关键帧不再是进行插值了,当到达关键时间时,属性突然改变为新值。离散关键帧类则使用"Discrete数据类型+KeyFrame"的形式命名。当运行这个动画时中心点会在适当的时间从一个位置跳转到下一个位置,所有关键帧动画类都支持离散关键帧,但只有一部分关键动画类支持线性关键帧。

8、【缓动型】关键帧动画:离散关键帧动画的分支,常用的缓动关键帧类有:EasingDoubleKeyFrame、EasingColorKeyFrame、EasyingPointKeyFrame。每个缓动关键帧类和对应的线性插值关键帧类的工作方式相同,但是额外提供了EasyingFunction属性。

9、基于帧的动画【后台操控】:使用帧的动画要为静态的CompositionTarger.Rendering事件关联事件处理程序,一旦关联处理程序,WPF将以每秒调用60次的速度开始不断地调用这个事件处理程序,当动画结束后,再分离事件处理程序。

最后

以上就是魁梧冷风为你收集整理的WPF三大常用动画的全部内容,希望文章能够帮你解决WPF三大常用动画所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部