Animation类插值动画类
XAML部分代码
C#部分代码
private void Button_Click(object sender, RoutedEventArgs e{
DoubleAnimation doubleAnimation = new DoubleAnimation();
doubleAnimation.From
= btn1.Width;
doubleAnimation.AccelerationRatio = 0.5;
doubleAnimation.DecelerationRatio
= 0.2;
doubleAnimation.SpeedRatio
= 10;
doubleAnimation.AutoReverse
= true;
doubleAnimation.By
= 400;
doubleAnimation.BeginTime
= new TimeSpan(1);
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);
DoubleAnimation w = new DoubleAnimation();
w.From = btn1.Height;
w.AccelerationRatio = 0.5;
w.DecelerationRatio = 0.2;
w.SpeedRatio = 10;
w.AutoReverse = true;
w.By = 500;
w.BeginTime = new TimeSpan(1);
w.Duration = new Duration(TimeSpan.FromSeconds(5));
w.RepeatBehavior = RepeatBehavior.Forever;
btn1.BeginAnimation(Button.HeightProperty, w);
}
动画效果如下(动画按钮那个Button会一直变大变小)
DoubleAnimation doubleAnimation = new DoubleAnimation();
用于实例化DoubleAnimation类
doubleAnimation.From = btn1.Width;
From属性,From属性是元素的开始值,这里是获取到name为btn1的元素的Width
doubleAnimation.AccelerationRatio = 0.5;
doubleAnimation.DecelerationRatio =
0.2;
AcclerationRation和DecelerationRation属性压缩部分时间轴,使动画运行的更快,并将拉伸其他时间进行补偿,使总时间保持不变。这两个属性都表示百分比值,例如,将AcceleRation属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加速。例如在1个10秒的动画中,前3秒会加速运行,而剩余的7秒会以恒定不变的速度运行,如果将DeceleRation属性设置为0.3,那么最后3秒回减速运行
doubleAnimation.SpeedRatio
= 10;
SpeedRatio 用于提高或减慢动画运行速度, SpeedRatio的初始属性值是1,所以如果将SpeedRatio属性值改为5那么动画运行速度将加快五倍,改为0.5那么动画运行速度将减慢一半的运行速度,
这里设置的值是10也就是说,动画运行速度将加快10倍
doubleAnimation.AutoReverse
= true;
AutoReverse值, AutoReverse默认值为frse为true时,动画完成播放时会自动反向播放,返回原始值(反向播放动画发生在动画完成之后,不受总时间限制/不会像使用AccelerationRatio或DecelerationRatio一样会压缩原动画的执行时间)
doubleAnimation.By = 400;
By与To一样是设置动画元素的结束值区别是
To值是设置或获取动画元素的结束值
By获取或设置动画元素更改其起始值时所依据的总量
也就是说如果使用To值,当动画运行完了之后动画元素值未退回原始值时,再次运行动画,动画将将不发生改变,额,动画不是不运行了,动画依旧在运行,只不过动画运行的初始值已经和To值一样了,使用动画看起来不发生改变
By值,By值是获取或设置动画元素更改其起始值时所依据的总量也就是说By值可以循环使用,因为他是更改动画元素起始值所依据的总量,也就是说它是在动画元素起始值的基础上再加上或减去By的值
doubleAnimation.BeginTime = new TimeSpan(1);
BeginTime 动画延迟, 设置将被添加到动画开始之前的延时时间(TimeSpan类型),这一延时总被加载到总时间,具有5秒延时的5秒动画,总时间是10秒
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
Duration 设置动画开始到结束的运行时间,这里设置的是五秒
Seconds/秒
doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
RepeatBehavior 设置动画运行的次数当RepeatBehavior值为Forever时就会一直重复动画
btn1.BeginAnimation(Button.WidthProperty, doubleAnimation);
BeginAnimation 为元素设置BeginAnimation方法,
Button.WidthProperty 进行动画的是Button的宽
特别注意!
WPF动画只是暂时的, 这意味着它们不能真正改变基本属性的值,当动画处于活动状态时,只是覆盖了属性的值。
单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保持为新值,这会导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的属性值。
有两个解决方法
1)
设置AutoReverse属性,将AutoReverse值设置为true如下图
(用法前面有就不写代码了)
但是,如果是在动画完成之后为属性设置最后的值,将会不起作用,因为动画会仅仅返回动画之前的值
方法二:
改变Fillbehavior属性,
Fillbehavior属性默认值为HoldEnd这意味着当动画结束时,会继续为目标元素应用最后的值,但如果将Fillbehavior的属性修改为Stop,这时候只要动画结束,属性就会恢复原来的值,这时候就可以为动画赋值了
所以,如果想修改动画完成后的属性值,可以使用AutoReverse属性为true,(适用于动画结束前) 也可以使用Fillbehavior并设置属性为stop(适用于动画结束后)
但是!这两个都不适用于RepeatBehavior属性值为Forever的时候,因为这时候动画会一直运行