Windowsphone中動畫編程的實現(xiàn)方式
方法一:基于定時器的實現(xiàn)
例:
在界面中添加一個Buton控件返帕,動畫實現(xiàn)Button的高度不斷增大降铸。
<Button x:Name=”MyButton” Height=”100” Content=”Button” Click=”MyButton_Click_1”></Button>
在.xaml.cs文件中添加:
Private void MyButton_Click_1(object sender, RoutedEventArgs e)
{
DispatcherTimer timer = new DispatcherTimer();
//定義一個定時器
timer.Interval = TimeSpan.FromMilliseconds(100);
//為定時器設定觸發(fā)間隔時間
timer.Tick += timer_Tick;
//為定時器添加觸發(fā)事件
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
if(MyButton.Height > 500)
{
???? timer.Stop();
???? return ;
}
MyButton.Height += 40;
}
這樣我們就可以實現(xiàn)一個簡單的動畫,這種實現(xiàn)方法是我們自己按照動畫的原理去實現(xiàn)的,在windowsphone中并不推薦這種實現(xiàn)方式,原因有以下幾點:
必須創(chuàng)建一個周期性觸發(fā)器的計時器。
當觸發(fā)計時器時會使用事件處理程序計算一些與動畫相關的細節(jié)睦优,性能差(所有的計算都是UI線程完成的)。
以上特性致使:可擴展性差壮不、動畫幀率固定刨秆、編寫復雜、性能差等忆畅。
方法二:使用Storyboard實現(xiàn)
Storyboard storyboard = new Storyboard();
DoubleAnimation animation = new DoubleAnimation();
animation.From = 100;
animation.To = 500;
animation.Duration = new Duration(TimeSpan.FromMilliseconds(1500));
Storyboard.SetTarget(animation, myButton);
Storyboard.SetTargetProperty(animation, new PropertyPath(("UIElement.Height")));
storyboard.Children.Add(animation);
storyboard.Begin();
使用Storyboard注意的步驟:
設置變化的起始和結束的值衡未、間隔時間,關聯(lián)控件家凯,關聯(lián)控件屬性缓醋。使用Storyboard最大的好處是與UI線程進行了分離,不會阻塞UI線程绊诲,也不會被UI線程打斷送粱。
另外,Storboard也可以作為一種資源掂之,放在.xaml文件中去抗俄。如下:
<phone:PhoneApplicationPage.Resources>
??????? <Storyboard x:Name="storyboard">
??????????? <DoubleAnimation Storyboard.TargetName="rectangle_1" Storyboard.TargetProperty="Height"
???????????????????????????? From="100" To="500" Duration="0:0:5"
???????????????????????????? AutoReverse="True" RepeatBehavior="2"></DoubleAnimation>
??????? </Storyboard>
</phone:PhoneApplicationPage.Resources>
在.xaml.cs中調用:
private void myButton_Click(object sender, RoutedEventArgs e)
{
??????????? storyboard.Begin();
}
實現(xiàn)方法三:使用UI變化屬性實現(xiàn)
在實現(xiàn)方法二中,雖然說UI線程不會阻塞動畫線程世舰,但是實際上UI線程阻塞會導致看上去動畫阻塞了动雹,因為這種方式去實現(xiàn)動畫需要重新繪制UI,但是當UI線程被阻塞時跟压,UI的繪制也就停下了胰蝠,我們的動畫在后臺在跑,但是UI上卻看不見。因此我們還有另外一種方法去實現(xiàn)動畫效果茸塞,即利用每個UI元素的變化屬性RenderTransform躲庄,相關的還有RenderTransformOrigin等。
對方法二做一下改動:
<phone:PhoneApplicationPage.Resources>
??????? <Storyboard x:Name="storyboard">
??????????? <DoubleAnimation Storyboard.TargetName="scaleTransform" Storyboard.TargetProperty="ScaleY"
???????????????????????????? From="1" To="6" Duration="0:0:5"
???????????????????????????? AutoReverse="True" RepeatBehavior="2"></DoubleAnimation>
??????? </Storyboard>
</phone:PhoneApplicationPage.Resources>
對應的rectangle改為:
<Rectangle x:Name="rectangle_1" Height="80" Fill="Red">
??????????????????? <Rectangle.RenderTransform>
??????????????????????? <ScaleTransform x:Name="scaleTransform" ScaleY="1"></ScaleTransform>
??????????????????? </Rectangle.RenderTransform>
??????????????? </Rectangle>
我們要理解一下方法二與方法一有什么區(qū)別:
在方法二中我們是對rectangle的高度直接進行更改已達到動畫的效果钾虐,實際上是要UI去重新繪制一個新的rectangle噪窘,二方法三中利用的是UI元素的一個基本屬性“變化”,系統(tǒng)對這種變化的實現(xiàn)不是去搞一個新的rectangle出來去重繪效扫,而是通過矩陣變化去影響rectangle在界面上的模樣倔监。我們可以想象rectangle本身沒有變化,而它以之為基準的坐標系發(fā)生了變化荡短,比如我們這里坐標系在Y方向上發(fā)生了從1倍到6倍的縮放變化丐枉,所以我們看上去rectangle就有了變化哆键。實際上這種坐標系的變化并不只是一維掘托、兩維的,而是一個三維立體的坐標系籍嘹,坐標系的變化是依靠一個多維矩陣的運算去實現(xiàn)的闪盔。因此方法三中并沒有UI的重繪,而是一種比UI更基礎的界面的變化辱士。