书名:WPF专业编程指南
作者:李应保
出版社:电子工业出版社
出版时间:2010-01
ISBN:9787121100116
第15章 动画
一、控制动画
- 动画的很多特性都是由TimeLine类控制的,它处在动画类继承树靠近树根的位置。
所谓TimeLine是指一个时间片,这个类提供了动画常用的属性,如动画时间、开始时刻、动画重复次数、动画终止的状态等
1 动画所用的时间(duration)
Duration用来指定某个相关属性动画从开始到结束所用的时间,如前面的例子:
da.Duration = new Duration(TimeSpan.Parse("0:0:5"));
一般使用TimeSpan来说明动画的时间,其格式如下:
days.hours:minutes:seconds.fraction.
注意在日和小时之间使用的是点“.”,在时分秒之间使用的是“:”,秒以下又是点“.”。常用动画通常在分秒之间,可以使用简化的形式,如5秒钟可以写为:
“0:0:5”
但不能把3.5秒写成“3.5”而要写成“0:0:3.5”,因为“3.5”表示3天零5小时。虽然在大多情况下,Duration用TimeSpan来表达,但是Duration和TimeSpan并不是一个类型。Duration除了用TimeSpan表示具体的动画时间之外,还有两个特殊值:Automatic和Forever。Automatic是Duration的默认值,其值为1秒,所以若不设定Duration,则WPF为动画提供的默认Duration为1秒。Forever主要用在故事板Storyboard中
2 设定动画开始时间BeginTime
- 在前面的例子中,我们在双击鼠标事件发生的时候立即开始动画,即BeginTime设为为0(默认值)。
实际上,也可以设定动画在某个时间开始,例如可以让动画在双击鼠标事件后两秒开始:
da.BeginTime = TimeSpan.Parse("0:0:2");
我们可以把BeginTime设为负数,这时动画相当于提前到某个时刻开始。
3 设定自动返回(AutoReverse)
- WPF动画提供了前进和后退功能。如果AutoReverse设为False,那么动画只向前进行,如果AutoReverse设为True,那么动画在完成前进的过程后,自动以相同的方式后退到初始状态。
比如前面的例子:
DoubleAnimation da = new DoubleAnimation();
da.From = 50;
da.To = 100;
da.Duration = new Duration(TimeSpan.Parse("0:0:30"));
da.AutoReverse = true;
myButton.BeginAnimation(Button.WidthProperty, da);
按钮宽度从50变到100要用30秒,把da.AutoReverse之后,经过30秒,按钮的宽度又回到50,这就是AutoReserve的动画效果。
4 设定动画速度(SpeedRatio)
- 当需要对两个以上对象进行类似动画时,可以微调同一个动画类,并把它们用在不同的对象上。
例如,可以用同一个DoubleAnimation对椭圆的宽度进行动画,但把动画的速度增加一倍,那么,可以简单地用下面的C#来完成:
da.SpeedRatio = 2;
ellipse1.BeginAnimation(Ellipse.WidthProperty, da);
把SpeedRatio设为2,然后把该动画加到椭圆上,运行该程序,可以看到,椭圆宽度动画的速度比按钮宽度快一倍。
5 加快和减慢动画(AccelarationRatio和DecelarationRatio)
- 对于简单的情况,可以使用AccelarationRatio和DecelarationRatio来调整相关属性的变化速度。
6 设定动画的重复特性(RepeatBehavior)
- 我们可以指定动画重复的次数,方法是设定RepeatBehavior。有两种方法来设定动画的重复特性,一种是设定重复的次数;第二种方法是设定动画重复到一定的时间
7 设定动画的终止状态(FillBehavior)
- 那么动画结束的时候,相应的相关属性的值是保持动画结束时的值还是回到最初的状态?WPF使得这两种结果都有可能,它取决于FillBehavior的值。FillBehavior有两个值:HoldEnd和Stop。若FillBehavior设为HoldEnd(默认值),动画结束时,相关属性的值为动画结束时的值;若FillBehavior设为Stop,动画结束时,相关属性的值为动画开始时的值。
8 设定相关属性的动画范围(From和To)
- WPF中的动画可以分为两类,一类是相关属性可以连续变化的,如Int16Animation、Int32Animation和DoubleAnimation等,另一类是不能连续变化的,如Bool、Char和String这些类型。对于可以连续变化的相关属性的动画,WPF提供设置动画的开始(From)和终止值(To),设定From和To后,WPF自动算出在某个特定的时刻,该相关属性的值。
9 设定相关属性的动画范围(By)
- 设定相关属性动画范围的另一个方法是使用By属性,By的意思是在所动画原有值的基础上加(若By为正)或减(若By为负)By值。例如,汽车在画布上的初始位置Left为100,若把By设为500,那么,汽车的动画范围就在100~600:
10 设定IsAdditive和IsCumulative 属性
11 WPF动画的时间片类
控制动画的进程主要是安排某个事件在某个时刻发生,安排时间序列就是TimeLine类的工作。WPF提供了丰富的TimeLine类,前面已介绍了Timeline类,这是一个基类,从TimeLine类中派生出三个类,分别为:AnimationTimeLine、TimelineGroup和MediaTimeLine。而TimelineGroup类又派生出ParrellelTime和Storyboard,如图15-4所示。
