动画时间轴的基本行为

动画中的时间总是和时间轴(Timeline)相联系,Timeline是所有动画的基类,代表一段动画的时间。而且时间轴具备层次关系,其起始和结束时间均相对于父时间轴的起始点来计算。时间轴比较学用到的属性有以下几个方面。

1.Duration

Duration属性用来描述时间的长短。如果想让动画持续2.7秒结束,C#代码如下:

DoubleAnimation animation = new DoubleAnimation();
            animation.From = 30;
            animation.To = 300;
            animation.Duration = TimeSpan.FromSeconds(2.7);
            animation.FillBehavior = FillBehavior.Stop;
上述代码中的给Duration赋值的时候,还可以用TimeSpan.Parse("0:0:2.7")的方式。在XAML文件中,可以用时:分:秒.小数格式的字符串来表示时间,代码如下:
<DoubleAnimation Storyboard.TargetName="rectangle" Storyboard.TargetProperty="Width" 
                                             From="30" To="300" Duration="0:0:2.7" FillBehavior="Stop"/>
Duration还有两个TimeSpan无法表达的值,即Duration.Forever和Duration.Automatic。其中Forever表示时间为无限期,对于DoubleAnimaiton这样简单的动画,意味着将无限的停留在初始值;Automatic是任何动画类的Duration属性的默认值,一般情况下表示1秒,但在Timeline嵌套的情况下有所不同。

2.BeginTime

如果不需要动画在调用BeginAnimation之后单立即开始,可以设置BeginAnimation为一个TimeSpan来插入一段延迟。BeginTime的值相对其父时间轴,如果设置为0秒,表示父时间轴和子时间轴同时开始;如果设置为2秒,则表示父时间轴开始2秒之后子时间轴开始。BeginTime甚至可以设置负值,如-2秒,表示子时间轴开始于父时间轴2秒之前。要注意一点的是BeginTime只有在第1次播放动画时会产生延迟,在后面重复时不会产生延迟。

3.AutoReverse和RepeatBehavior

AutoReverse属性用来描述动画是否会在动画结束之后从后向前重复一遍,如下代码:

<DoubleAnimation Storyboard.TargetName="rectangle" Storyboard.TargetProperty="Width" 
                                             From="30" To="300" Duration="0:0:2.7" FillBehavior="Stop" 
                                             BeginTime="2" AutoReverse="True"/>
AutoReverse属性默认为False,如果设置为True,如上述代码,那么这个矩形的宽度会从30变到300,然后再从300变回30.

RepeatBehavior表示重复的时间,可以有两种设置方式,一是使动画重复一定的次数。如果希望动画持续两次,则RepeatBehavior = "2x" ,字母x表示次数;二是设置动画重复的时间,与设置Duration的方式相同。RepeatBehavior也可以设置为Forever,表示该动画将永远重复;也可以设置为比Duration的赶时间短,这时它会提前停止动画。

4.SpeedRatio

SpeedRatio表示动画快慢的程度,一个小于1的值会减慢动画的速度;大于1的值会回事动画,但是其本身并不影响BeginTime。

<DoubleAnimation Storyboard.TargetName="rectangle1" Storyboard.TargetProperty="Width" 
        From="20" To="400" Duration="0:0:2" SpeedRatio="1"/>
<DoubleAnimation Storyboard.TargetName="rectangle2" Storyboard.TargetProperty="Width" 
        From="20" To="400" Duration="0:0:2" SpeedRatio="2" BeginTime="0:0:1"/>
<DoubleAnimation Storyboard.TargetName="rectangle3" Storyboard.TargetProperty="Width" 
        From="20" To="400" Duration="0:0:2" SpeedRatio="0.5"/>
在上述代码中,第一个矩形在两秒钟将宽度从20变化到400,由于SpeedRatio设置为1,所以动画的真实时间仍然为两秒钟。第二个矩形框在两秒钟内将宽度从20变化到400,由于SpeedRatio设置为2,因此时间应该为1秒,再加上延迟时间(BeginTime = 0:0:1),因此总时间仍为两秒钟。第三个矩形框前面的设置同第1个矩形框,不同的是SpeedRatio设置为0.5,因此动画速度减慢,总的时间为4秒。

5.动画的时间轴长度属性

动画的时间长度除了Duration属性,还与多个属性有关。我们可以用下面的公式来计算时间轴的长度:

时间轴的长度 = BeginTime + (Duration*(AutoReverse?2:1)*RepeatBehavior/SpeedRatio)

注意RepeatBehavior表示的是次数,如果是时间,则整个时间轴的长度仅仅是BeginTime和RepeatBehavior之和:

时间轴的长度 = BeginTime + RepeatBehavior

6.AccelerationRatio和DecelerationRatio

默认情况下,动画以线性方式更新目标值,通过改变AccelerationRatio和DecelerationRatio的值可以使动画变成非线性,从而使动画更加生动。AccelerationRatio和DecelerationRatio两个属性可以设置为0到1范围内的double值,0为默认值。AccelerationRatio值表示目标值从静止开始加速的时间百分比,DecelerationRatio表示减速到静止的时间百分比,因此这两个属性的总和必须小于或者等于1。这两个值是加速和减速占整个时间的百分比。

7.IsAdditive和IsCumulative

IsAdditive和IsCumulative不是Timeline的属性,但是绝大多数动画类都有这两个属性。IsAdditive默认为False,如果设置为True,会将目标属性的当前值添加到动画的From和To属性中。IsCumulative和IsAdditive的不同在于与RepeatBehavior一起使用,而且仅能与RepeatBehavior一起使用。

8.FillBehavior

默认情况下,当一个动画完成时目标属性仍然在最终的动画值上,通常也是期望的结果。如果希望在动画完成后恢复原属性值,则将FillBehavior设置为Stop。FillBehavior的另一个值为HoldEnd,即FillBehavior的默认值,表示动画完成后目标属性为最终动画值。

注:TargetProperty如何设置附加属性?——如果TargetProperty的值是附加属性,需要添加小括号 TargetProperty = "(Canvas.Left)"。实际上也不仅是附加属性,如前面设置Width属性时写成TargetProperty = "(Rectangle.Width)",也需要使用括号,只不过普通属性大多数没必要这样写而已。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值