第15章 動畫基礎(1)——概述、通過程式碼建立動畫和動畫的生命週期
一、動畫概述
①動畫是WPF模型的核心部分。這意味著為了讓動畫動起來,不需要使用計時器以及事件處理程式碼,只需要使用宣告的方式即可建立動畫。
②WPF動畫是基於屬性的動畫。本質上,WPF動畫只不過是在一段時間間隔內修改下依賴項屬性而已。
③建立正確動畫的祕密在於決定需要修改什麼屬性。
④為了實現屬性的動態化,需要有支援相應資料型別的動畫類。如Button.Width屬性使用雙精度資料型別,就必須使用DoubleAnimation類實現動畫。
⑤動畫分為:線性插值動畫、關鍵幀動畫和路徑動畫
線性插值動畫:指在開始值和結束值之間以逐步增加的方式進行的動畫。
命名方式:型別名+Animation。如:DoubleAnimation
關鍵幀動畫:指一個值突然改變到另一個值的動畫。
命名方式:型別名+AnimationUsingKeyFrames。如:ColorAnimationUsingKeyFrames
從適用範圍上將關鍵幀動畫大於線性插值動畫。可以這樣講所有支援關鍵幀動畫的資料型別,都支援線性插值動畫,但反過來不成立。
路徑動畫:值沿著指定路徑移動的動畫,它比前兩種動畫更加專業。
命名方式:型別名+AnimationUsingPath。如:PointAnimationUsingPath
⑥所有動畫類都定義在System.Windows.Media.Animation名稱空間下,共計42個。詳情見書P352-P353。
二、通過程式碼建立動畫
①每個依賴屬性每次只能響應一個動畫,如果開始第二個動畫,將自動放棄第一個動畫。
②線性插值動畫的常用屬性:
From屬性:屬性開始值。
若沒有硬編碼屬性值,此時動畫省略設定該屬性的話,動畫無法執行會報錯,因為無法獲取該屬性值。
ActualWidth屬性指按鈕當前渲染時的寬度。這樣設定意味著即使在動畫執行中單擊按鈕,也不會使動畫從頭再來。private void myButtonn_Click(object sender, RoutedEventArgs e) { DoubleAnimation wa = new DoubleAnimation(); wa.From = myButtonn.ActualWidth; wa.To = this.Width - 30; wa.Duration = TimeSpan.FromSeconds(5); myButtonn.BeginAnimation(Button.WidthProperty, wa); }
To屬性:屬性結束值。
若省略To屬性,則意味著回到元素的原始屬性值。
By屬性:建立按設定的值改變動畫,而不是給定目標值。會實現元素觸發一下,變化一點的效果。
private void myButtonn_Click(object sender, RoutedEventArgs e)
{
DoubleAnimation wa = new DoubleAnimation();
wa.From = myButtonn.ActualWidth;
wa.By = 10;
wa.Duration = TimeSpan.FromSeconds(5);
myButtonn.BeginAnimation(Button.WidthProperty, wa);
}
Duration屬性:動畫執行時間。
三、動畫的生命週期
①WPF動畫是暫時的,它不會能真正改變基本屬性的值。
②當動畫執行完成時,通過程式碼設定元素屬性值是不起作用的,這是因為元素屬性優先使用動畫之後的值。
③通過設定AutoReverse屬性為True,可反轉動畫。
④FillBehavior屬性。通常該屬性值為HoldEnd,這意味著動畫結束後,元素屬性值為動畫結束後的值。若設定該屬性值為Stop,則意味著只要動畫結束,屬性就會自動恢復為原來的值。
⑤AccelerationRatio屬性加速動畫執行速度,DecelerationRatio屬性減速動畫執行速度,兩個值都用百分比表示。
通過加速和減速的動畫看上去更加自然。
⑥RepeatBehavior屬性可控制如何重複執行動畫。