天天看點

Animation類插值動畫類

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

繼續閱讀