学习WPF的动画,非常值得一提的是关键帧动画。普通的动画实现的是从一个值到另一个值的线性内插(或者有限形式的非线性内插,归功于AccelerationRatio和DecelerationRatio)。而关键帧动画,指定了在指定的时间达到指定的值(由XXXKeyFrame的KeyTime、Value决定),因此,可以实现更加复杂的动画。
除了From、To和By属性外,关键帧动画类与它们对应的普通动画类拥有相同的属性和事件。但是,它们还有一个KeyFrame集合来放置一些特定类型动画的关键帧实例。WPF中,关键帧类型有3种,它们是线性关键帧(LinearXXXKeyFrame)、样条关键帧(SplineXXXKeyFrame)和离散关键帧(DiscreteXXXKeyFrame)。
1、线性关键帧(LinearXXXKeyFrame)
线性关键帧动画例如:
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Width" Duration="0:0:3">
<LinearDoubleKeyFrame KeyTime="0:0:0" Value="10"/>
<LinearDoubleKeyFrame KeyTime="0:0:1" Value="20"/>
<LinearDoubleKeyFrame KeyTime="0:0:2" Value="30"/>
<LinearDoubleKeyFrame KeyTime="0:0:3" Value="40"/>
</DoubleAnimationUsingKeyFrames>
每个LinearDoubleKeyFrame都有一个特定的值,以及应用该值所对应的时间。KeyTime的设置不是必须的,如果忽略了某一个KeyTime,则WPF会假设该关键帧发生在前后两个关键帧中间。如果忽略了所有的KeyTime,它们几个就会平均的瓜分动画的时间,当然,你也可以通过“KeyTime="Uniform"”来显示设定。另外,KeyTime可以是一个百分比——“KeyTime="33.3%"”,它表示时间点为总时间的1/3。KeyTime可以是“KeyTime="Paced"”,表示整个动画值的改变速率是个常数,依据各自的改变量设置相应的KeyTime。
LinearDoubleKeyFrame表示它在KeyTime时刻,值达到Value指定的值。而值的变化是从前一个状态的值以线性内插的方式到达现在状态的值。
DoubleAnimationUsingKeyFrames 中不光可以容纳线性关键帧,还可以容纳同类型的样条关键帧和离散关键帧,因为KeyFrames属性一个XXXKeyFrame(抽象)对象的集合。
2、样条关键帧(SplineXXXKeyFrame)
如果把上面代码中的LinearDoubleKeyFrame替换成SplineDoubleKeyFrame,产生的效果是一样一样的。
样条关键帧与线性关键帧的区别在于它有一个KeySpline属性,可以设置成一个KeySpline对象的实例,该实例将想要的动作描述为一个三次贝赛尔曲线。在XAML中,KeySpline属性需要设置两个控制点(起点默认为0,结束点默认为1),由这四个点可以产生贝赛尔曲线。而样条关键帧中值的变化快慢将由产生的贝赛尔曲线决定。因此,在相同的时间内,依据不同的贝赛尔曲线,可以产生快慢、慢快、快慢快、慢快慢等一系列复杂的值的变化组合。由于是三次方曲线,因此,值的变化相对而言,能以一种优美的姿态变化。
3、离散关键帧(DiscreteXXXKeyFrame)
离散关键帧只是表示在它与前一个关键帧之间不需要插值,值的变化是跳跃的。
17个类型都有相应的线性、样条和离散关键帧,但WPF还有5个额外的离散关键帧,它们没有对应的线性和样条关键帧:Boolean、Char、Matrix、Object和String。之所以只支持这些数据类型的离散关键帧动画,是因为对这些类型来说,实现内插没有意义且不太可能。