- Silverlight 教程
- Silverlight - 首頁
- Silverlight - 概述
- Silverlight - 環境設定
- Silverlight - 快速入門
- Silverlight - XAML 概述
- Silverlight - 專案型別
- Silverlight - 固定佈局
- Silverlight - 動態佈局
- 受約束與不受約束
- Silverlight - CSS
- Silverlight - 控制元件
- Silverlight - 按鈕
- Silverlight - 內容模型
- Silverlight - ListBox
- Silverlight - 模板
- Silverlight - 可視狀態
- Silverlight - 資料繫結
- Silverlight - 瀏覽器整合
- Silverlight - 瀏覽器外執行
- Silverlight - 應用和資源
- Silverlight - 檔案訪問
- Silverlight - 檢視模型
- Silverlight - 輸入處理
- Silverlight - 隔離儲存
- Silverlight - 文字
- Silverlight - 動畫
- Silverlight - 影片和音訊
- Silverlight - 列印
- Silverlight 有用資源
- Silverlight - 快速指南
- Silverlight - 有用資源
- Silverlight - 討論
Silverlight - 動畫
動畫允許您建立真正動態的使用者介面。它常用於應用效果,例如,滑鼠移過時增大的圖示、旋轉的徽標、滾動顯示的文字等等。
有時,這些效果看起來像過度的炫技。如果使用得當,動畫可以多種方式增強應用程式。它們可以使應用程式看起來更具響應性、更自然、更直觀。
例如,單擊時滑入的按鈕感覺像一個真實的物理按鈕,而不僅僅是另一個灰色的矩形。動畫還可以將注意力吸引到重要元素上,並引導使用者過渡到新的內容。
Silverlight 的動畫方法是宣告式的,而不是專注於幀動畫序列。
定義動畫
動畫通常在資源部分定義。事實上,它們通常包含在一個故事板元素中,我們稍後將詳細介紹。
它提供了一個 Begin() 方法,因此可以從程式碼中呼叫動畫。
動畫也可以放在控制元件模板中的可視狀態元素內。
宣告式動畫
Silverlight 中的動畫是宣告式的。它們描述了想要發生的事情。讓 Silverlight 來解決如何實現它。因此,動畫通常遵循以下模式:我們告訴 Silverlight 我們想要更改什麼。
這始終是某些命名元素上的某些屬性,即 **TargetName** 和 **TargetProperty**。
<DoubleAnimation Storyboard.TargetName = "myRectangle" Storyboard.TargetProperty = "Opacity" From = "0" To = "1" Duration = "0:0:5" />
我們說明我們希望該屬性如何更改,在本例中,我們將不透明度從零值更改為一值。換句話說,我們希望目標元素從不透明淡出到透明。
最後,我們說明我們希望這需要多長時間,在本例中需要五秒鐘。
此雙精度動畫的意義在於它針對的是型別為雙精度的屬性,即浮點值。
如果要動畫化表示顏色的屬性,請改用顏色動畫。
讓我們來看一個簡單的雙精度動畫示例。下面是 XAML 程式碼,其中添加了兩個按鈕、一個矩形和兩個故事板。
<UserControl x:Class = "DoubleAnimationExample.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d" d:DesignWidth = "640" d:DesignHeight = "480">
<UserControl.Resources>
<Storyboard x:Name = "fadeDown">
<DoubleAnimation
Storyboard.TargetName = "myRectangle"
Storyboard.TargetProperty = "Opacity"
From = "1" To = "0"
Duration = "0:0:5" />
</Storyboard>
<Storyboard x:Name = "fadeUp">
<DoubleAnimation
Storyboard.TargetName = "myRectangle"
Storyboard.TargetProperty = "Opacity"
From = "0" To = "1"
Duration = "0:0:5" />
</Storyboard>
</UserControl.Resources>
<Grid x:Name = "LayoutRoot">
<Rectangle x:Name = "myRectangle"
Fill = "Blue" Width = "300" Height = "100"
HorizontalAlignment = "Center"
VerticalAlignment = "Top" Margin = "0,30" />
<Button x:Name = "fadeUpButton" Content = "Up" Width = "80"
Height = "30" HorizontalAlignment = "Left"
VerticalAlignment = "Top" Margin = "50,140,0,0"
Click = "fadeUpButton_Click" />
<Button x:Name = "fadeDownButton" Content = "Down"
Width = "80" Height = "30" HorizontalAlignment = "Left"
VerticalAlignment = "Top" Margin = "50,180,0,0"
Click = "fadeDownButton_Click" />
</Grid>
</UserControl>
以下是 C# 中不同事件的實現。
using System.Windows;
using System.Windows.Controls;
namespace DoubleAnimationExample {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void fadeUpButton_Click(object sender, RoutedEventArgs e) {
fadeUp.Begin();
}
private void fadeDownButton_Click(object sender, RoutedEventArgs e) {
fadeDown.Begin();
}
}
}
編譯並執行上述程式碼後,您將看到以下輸出。
重複和反轉
動畫提供了一些屬性來自動重複和反轉動畫。
如果將重複行為屬性設定為時間跨度,則動畫將迴圈重複,直到經過指定的時間量,或者您可以只告訴它要重複多少次。
這支援小數點,因此您可以重複四次半。
您可以無限期地重複,也可以告訴動畫,一旦它到達末尾,它應該反向執行回到開始。
關鍵幀動畫
通常,從 A 到 B 的簡單動畫過於簡單。例如,您想動畫化一個球從地面反彈。這不是簡單的點到點運動。球下降,逐漸加速,然後在擊中底部時反向其方向。在回到行程頂部時再次減速。
讓我們來看一個簡單的 **關鍵幀動畫** 示例。
下面是 XAML 程式碼,其中包含一個橢圓和具有關鍵幀的雙精度動畫。
<UserControl x:Class = "LinearKeyFrames.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
Width = "400" Height = "300">
<UserControl.Resources>
<Storyboard x:Name = "ballAnim" SpeedRatio = "0.2">
<DoubleAnimation From = "0" Duration = "00:00:03" To = "96"
Storyboard.TargetName = "ellipse"
Storyboard.TargetProperty = "(Canvas.Left)" />
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName = "ellipse"
Storyboard.TargetProperty = "(Canvas.Top)">
<LinearDoubleKeyFrame KeyTime = "00:00:00" Value = "0"/>
<LinearDoubleKeyFrame KeyTime = "00:00:00.5" Value = "16" />
<LinearDoubleKeyFrame KeyTime = "00:00:01" Value = "48"/>
<LinearDoubleKeyFrame KeyTime = "00:00:01.5" Value = "112"/>
<LinearDoubleKeyFrame KeyTime = "00:00:02" Value = "48"/>
<LinearDoubleKeyFrame KeyTime = "00:00:02.5" Value = "16"/>
<LinearDoubleKeyFrame KeyTime = "00:00:03" Value = "0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name = "LayoutRoot" Background = "White">
<Canvas>
<Ellipse x:Name = "ellipse" Fill = "Aqua" Width = "50" Height = "50" />
</Canvas>
</Grid>
</UserControl>
以下是 **滑鼠左鍵** 按下事件的實現,當用戶按下網頁上的滑鼠左鍵時,該事件將開始動畫。
using System.Windows.Controls;
using System.Windows.Input;
namespace LinearKeyFrames {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
this.MouseLeftButtonDown += new MouseButtonEventHandler(Page_MouseLeftButtonDown);
}
void Page_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
ballAnim.Begin();
}
}
}
編譯並執行上述程式碼後,您將看到以下輸出。
單擊網頁時,您會看到球開始移動。