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的時候,因為這時候動畫會一直運作