XAML高级教程(五)

本文详细介绍了WPF中的动画控制,包括PauseStoryboard、ResumeStoryboard等操作,以及如何通过事件触发器进行动画控制。此外,讨论了Storyboard事件,如Completed和CurrentTimeInvalidated,用于监视动画进度。文章还深入探讨了缓动函数的作用,如BackEase、ElasticEase和CubicEase,以及如何创建自定义缓动函数。最后,提到了关键帧动画和离散关键帧在实现不规则移动动画中的应用,以及如何利用CompositionTarget.Rendering事件实现基于帧的动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制播放:控制故事板的动作类
PauseStoryboard:停止播放动画并且保持当前位置;
ResumeStoryboard:恢复播放暂停的动画;
StopStoryboard:停止播放动画,并将动画时钟重新设置到开始位置;
SeekStoryboard:跳到动画时间线中的特定位置,如果当前动画正在播放,就继续从新位
置播放。如果当前动画是暂停的,就继续保持暂停;
SetStoryboardSpeedRatio:改变整个故事板的SpeedRatio属性值;
SkipStoryboardToFill:将故事板移动到时间线的终点。FillBehavior属性设置 为HoldEnd,
动画继续保持最后的值;
RemoveStoryboard:移除故事板,停止所有正在运行的动画,并将属性返回为原来的、最后
一次设置的数值。
为成功地执行这些动作,必须在同一个Triggers集合中定义所有的触发器,如果将 BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中, PauseStoryboard动作就无法工作。
在包含元素的Triggers集合中(在这里是Window.Triggers集合),使用 EventTrigger.SourceName属性关联这些事件触发器,只要SourceName属性和为按钮设置的Name属性相匹配,触发器就会用到恰当的按钮上。还必须要问BeginStoryboard动作指定名称,这样其他触发器BeginStoryboardName属性指定这个名称,连接到相同的 故事板,然后进行控制。
故事板事件:
Completed:动画已经到达终点;
CurrentGlobalSpeedInvalidated:速度发生了变化,或者动画被暂停、重新开 始、停止或
移到某个新的位置;
CurrentStateInvalidated:动画已经开始或结束;
CurrentTimeInvalidated:动画时钟已经向前移动了一个步长,正在更改动画。当动画开始、
停止或结束时也会引发该事件;
RemoveRequested:动画正在被移除。
监视动画进度:
如果要监视动画,要用到Storyboard的一些事件。在这里使用的是CurrentTimeInvalidated事件,每次向前移动动画时钟都会引发该事件。当引发 CurrentTimeInvalidated事件时,发送者是Clock对象(Color类位于 System.Windows.Media.Animation名称空间中),可通过Clock对象检索当前时间。当前时间使用TimeSpan对象表示,并且可检索当前进度,当前进度使用0~1之间的数值表示。
动画缓动:
线性动画有一个缺点,通常让人觉得机械和不够自然。改进动画并创建更趋自然的动画的秘诀是改变变化速率。不是创建以固定不变的速率改变属性的动画,而是需要设计根据某种方式加速或减速的动画,实现更趋自然的动画的最简单方法是使用预置的缓动函数(EasingFunction)。EasyingFunction属性只能接受单个缓动函数对象,所以不能为同一个动画结合不同的缓动函数。
缓动函数类:
在继续分析不同的缓动类之前,理解缓动函数的应用时机是很重要的。所有的缓动函数类都继承自EasingFunctionBase类,并且继承了EasingMode属性,EasingMode有三种值,分别是:EaseIn(在动画开始时应用缓动效果)、EaseOut(动画结束时应用缓动效 果)和EaseInOut(在开始和结束时应用缓动动画)。当应用缓动函数时不会改变动画的持续时间。
缓动函数常用类:
BackEase:当使用EaseIn模式应用该缓动函数时,在动画开始之前拉回动画,当使用EaseOut模式应用该缓动函数时,允许动画稍微超越,然后拉回。Amplitude属性决定了拉回和超越的量。默认值是1,可减小该属性值(大于0的任何值)以缩减效果,或增加该属性值放大效果。
ElasticEase:当使用EaseOut模式应用该缓动函数时,使动画超越其最大值并前后摆动,逐渐减慢。当时用EaseIn模式应用该缓动函数时,动画在其开始值周围前后摆动,逐渐增加。Oscillations属性控制动画 前后摆动的次数;
BounceEase:执行与Elastic缓东函数类似的效果,只是弹跳永远不会超越初始值或最终值。Bounces属性控制动画回调的次数(默认是2);
CircleEase:使用圆函数加速(使用EaseIn模式), 或减速(使用EaseOut模式);
CublicEase:使用基于时间立方的函数加速,其效果与Circle类似,但是加速效果更缓和;
QuadraticEase:使用基于时间平方的函数加速,效果与CublicEase类似,但加速过程更明显。
自定义缓动函数:创建自定义缓动函数一般需要以下几个步骤
1、 新建一个类,让其继承自EasingFunctionBase类;
2、 重写EaseInCore()方法和CreateInstanceCore()方法;
3、 定义依赖属性;
4、 引用。
WPF动画性能和帧率:
通常,为用户界面应用动画,只不过是创建并配置正确的动画和故事版对象。但在其他 情况下,特别是同时发生多个动画时,可能更加需要关注性能。WPF试图保持以60帧/秒 的速度进行动画,可以确保从开始到结束得到平滑流畅的动画。帧速率越低,会发生 抖动现象。帧速率越高,占用的CPU也就越高。通过TimeLine.DesiredFrameRate属 性进行调整。
动态变换:
变换提供了自定义元素的最强大方式之一。每个元素都能以两种不同的方式使用变换,RenderTransform属性和LayoutTransform属性。RenderTransform属 性效率更高。因为是在布局之后应用变换,并且用于变换最终的渲染输出。LayoutTransform在布局前应用,从而其他控件需要重新排列以适应变换。
关键帧动画:
如果需要创建具有多个分段的动画和不规则移动的动画,这个时候可以使用关键帧动画。关键帧动画是由许多较短的段构成的动画,每段表示动画的初始 值、最终值或中间值。当运行动画时,她平滑地从一个值移动到另一个值。关键帧对象基本上都有Value属性和KeyTime属性。和其他普通动画不同的是 Value属性的数据类型,在LinearPointKeyFrame类中是Point类型,在 DoubleKeyFrame类中是double类型。
离散的关键帧动画:
如上图,使用的是线性关键帧动画,所以,它在关键帧动画之间平滑地过度。另一种选择是使用离散关键帧,离散关键帧不是进行插值,当到达关键时间时,属性突然改变为新值。线性关键帧类通常使用"Linear"+数据类型 +KeyFrame"的形式进行命名,离散关键帧类使用"Discrete数据类型 +KeyFrame"的形式命名。当运行这个动画时中心点会在适当的时间从一个位置跳转到下一个位置。所有关键帧动画类都支持离散关键帧,但只有一部分关键动画类支持线性关键帧。
缓动关键帧:
由离散关键帧可以得出:尽管关键帧动画被分割成多段,但每段仍使用普通的线性插值。常用的缓动关键帧类有:EasingDoubleKeyFrame、 EasingColorKeyFrame、EasyingPointKeyFrame。每个缓动关键帧类和对应的线性插值关键帧类的工作方式相同,但是额外提供了EasyingFunction属性。
基于帧的动画:
使用帧的动画要为静态的CompositionTarger.Rendering事件关联事件处理程序,一旦关 联这个处理程序,WPF就开始不断地调用这个事件处理程序,WPF将每秒调用60次。当动画结束后,分离事件处理程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值