Khái quát về Hiệu ứng Hoạt Hoạ Trong Silverlight
Tuesday, 2. June 2009, 05:27:52
Mục lục: Hoạt Hoạ Trong Silverlight
Chủ đề này bao gồm những phần sau:
- Giới thiệu về Hiệu ứng
- Making a UIElement Fade In and Out of View
- Start, Stop, Pause, and Resume một đối tượng Animation
- Quản lý thời gian bắt đầu Hiệu ứng
- Tạo ra một Hiệu ứng trong Mã Thủ tục (Creating an Animation in Procedural Code )
- Các loại Hiệu ứng
- Ứng dụng một loại Hiệu ứng cho một Property
- Các biến đổi Hiệu ứng
- Điều gì sẽ xảy ra sau khi một Hiệu ứng kết thúc?
1. Giới thiệu về các Hiệu ứng:
Hiệu ứng là một ảo giác được tạo ra bởi việc luân chuyển một cách nhanh chóng một loạt các hình ảnh, mỗi cái có một sự khác biệt nhỏ so với cái trước. Bộ não lĩnh hội nhóm hình ảnh đó như là một cảnh đang biến đổi độc lập. Trong phim, ảo giác này được tạo ra bằng cách sử dụng máy quay phim để ghi lại nhiều bức ảnh, khung ảnh trong mỗi giây. Khi các khung ảnh đó được chiếu lại bởi một máy chiếu phim, khán giả sẽ nhìn thấy một hình ảnh đang chuyển động. Trong Silverlight, bạn tạo hiệu ứng cho các đối tượng bằng cách ứng dụng hiệu ứng cho các đặc tính/thuộc tính cá nhân của chúng. Ví dụ, để làm cho một UIElement lớn lên, bạn tạo hiệu ứng cho các thuộc tính bề rộng và chiều cao của nó. Để làm cho một UIElement nhìn mờ đi, bạn phải tạo hiệu ứng cho thuộc tính chắn sáng của nó. Silverlight bao gồm nhiều đối tượng mà các thuộc tính có thể hiệu ứng được.
Chú ý:
Trong Silverlight, bạn có thể thực hiện những hiệu ứng đơn giản chỉ trên những thuộc tính mà những giá trị của chúng thuộc loại Double, Color, hoặc Point. Thêm vào đó, bạn có thể tạo hiệu ứng cho các thuộc tính của những loại khác bằng cách sử dụng ObjectAnimationUsingKeyFrames, nhưng điều này được thực hiện sử dụng phép nội suy riêng rẽ (nhảy từ giá trị này sang giá trị khác), đó không phải là cái mà hầu hết mọi người coi là hiệu ứng thật.
Phần tiếp theo sẽ chỉ cách để tạo ra một hiệu ứng đơn giản mà tạo ra một Rectangle, một loại của UIElement, làm tăng dần cường độ và giảm dần cường độ của cảnh nhìn (đậm dần và nhạt dần).
2. Làm cho một UIElement tăng dần cường độ và giảm dần cường độ của cảnh nhìn:
Ví dụ này chỉ ra cách sử dụng một hiệu ứng Silverlight để làm cho một Rectangle tăng dần cường độ và giảm dần cường độ của cảnh nhìn bằng cách hiệu ứng một giá trị thuộc tính. Nó sử dụng một DoubleAnimation, một loại của hiệu ứng mà tạo ra các giá trị Double, để hiệu ứng thuộc tính Opacity của một Rectangle. Kết quả thu được là làm cho Rectangle đó tăng dần cường độ và giảm dần cường độ của cảnh nhìn (đậm dần và nhạt dần). Để xem bản duyệt trước của hiệu ứng mà bạn sẽ được lĩnh hội, click vào link bên dưới để chạy bản mẫu và sau đó click vào hình chữ nhật để bắt đầu hiệu ứng.
Chạy thử ví dụ!
Phần đầu tiên của bản mẫu tạo ra một đối tượng Rectangle và hiển thị nó trên một StackPanel.
<StackPanel>
<Rectangle MouseLeftButtonDown="Mouse_Clicked" x:Name="MyAnimatedRectangle"
Width="100" Height="100" Fill="Blue" />
</StackPanel>
Để tạo ra một hiệu ứng và ứng dụng nó vào thuộc tính Opacity của Rectangle , bạn sẽ phải làm những việc sau:
• Tạo ra một DoubleAnimation
• Tạo ra một Storyboard
• Bắt đầu Storyboard ứng với một event.
Những bước này sẽ được thảo luận chi tiết trong các phần sau. Ví dụ đầy đủ ở cuối mục 2 này.
2a. Tạo một DoubleAnimation
Bởi vì thuộc tính Opacity là thuộc kiểu Double, bạn cần một hiệu ứng mà tạo ra những giá trị Double. DoubleAnimation là một dạng hiệu ứng như vậy; nó tạo ra một sự chuyển tiếp giữa hai giá trị Double. Để chỉ ra giá trị bắt đầu của DoubleAnimation, bạn cài đặt thuộc tính From. Để chỉ ra giá trị kết thúc của nó, bạn đặt thuộc tính To.
• Khi giá trị Opacity là 1.0 thì đối tượng hoàn toàn có thể trông thấy được, không bị mờ đục nhưng khi giá trị Opacity là 0.0 thì đối tượng không thể trông thấy được. Để tạo hoạt hoạ chuyển từ 1.0 sang 0.0, chúng ta thiết lập thuộc tính From là 1.0 và To là 0.0.
<DoubleAnimation From="1.0" To="0.0" />
• Chỉ ra một Duration cho hiệu ứng. Thuộc tính Duration của một hiệu ứng chỉ ra khoảng thời gian cần để đi từ giá trị bắt đầu đến giá trị đến của nó. Ví dụ sau thiết đặt khoảng thời gian của hiệu ứng là tới 1 giây.
<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1" />
• Ví dụ trước tạo ra một hiệu ứng mà sự chuyển tiếp là từ 1.0 đến 0.0, tạo ra phần tử mục tiêu là làm thay đổi dần cường độ tín hiệu từ hoàn toàn nhìn thấy sang hoàn toàn không nhìn thấy được. Để tạo ra phần tử thay đổi cường độ tín hiệu quay trở lại cảnh nhìn sau khi nó biến mất, cài đặt thuộc tính AutoReverse thành True. Để tạo ra hiệu ứng lập đi lập lại một cách không xác định. Cài đặt thuộc tính RepeatBehavior thành Forever.
<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever"/>
2b. Tạo ra một Storyboard
Để ứng dụng một hiệu ứng vào một đối tượng, bạn tạo ra một đối tượng Storyboard và sử dụng các thuộc tính kèm theo TargetName và TargetProperty để chỉ ra đối tượng và thuộc tính cần hiệu ứng.
• Tạo Storyboard và thêm phần hiệu ứng như là một con của nó.
<Storyboard>
<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
Mặc dù Storyboard trong ví dụ này chỉ bao gồm một hiệu ứng đơn lẻ, bạn có thể thêm vào nhiều hiệu ứng .
• Sử dụng thuộc tính đính kèm TargetName để chỉ ra đối tượng áp dụng hiệu ứng. Trong mã sau, DoubleAnimation được đưa ra một cái tên đích của AnimatedRectangle, là tên của đối tượng cần hiệu ứng.
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyAnimatedRectangle"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
• Sử dụng thuộc tính đính kèm TargetName để chỉ ra đối tượng áp dụng hiệu ứng. Trong mã sau, hiệu ứng được thiết lập cấu hình để nhắm đích cho thuộc tính Opacity của một đối tượng Rectangle.
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
2c. Kết hợp Storyboard với một Event
Tại điểm này bạn phải chỉ ra đối tượng đích đến của hiệu ứng và cách hiệu ứng vận hành; bây giờ bạn cần chỉ ra khi nào hiệu ứng bắt đầu. Bạn có thể làm điều này bằng cách sử dụng một event.
• Tạo cho Storyboard một nguồn. Đặt Storyboard bên trong một block nguồn để bạn có thể dễ dàng tham chiếu Storyboard từ mã để bắt đầu, kết thúc, tạm dừng, và tiếp tục lại. Phần đánh dấu sau chỉ ra Storyboard được biểu thị trong block nguồn đối tượng StackPanel. Chú ý rằng bạn có thể biểu thị Storyboard trên bất kỳ block nguồn nào mà nằm trong cùng một phạm vi của đối tượng mà bạn muốn hiệu ứng.
<StackPanel>
<StackPanel.Resources>
<!-- Animates the rectangle's opacity. -->
<Storyboard x:Name="myStoryboard">
<DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</StackPanel.Resources>
<Rectangle x:Name="MyAnimatedRectangle" Width="100" Height="100" Fill="Blue" />
</StackPanel>
• Gắn một Event vào một Element. Có rất nhiều dạng Event mà bạn có thể sử dụng để bắt đầu một hiệu ứng, bao gồm các event liên quan đến con chuột như là MouseLeftButtonDown, cái sẽ hiện lên khi người sử dụng click vào đối tượng, hoặc event Loaded, cái sẽ hiện lên khi một đối tượng đầu tiên tải. Để biết thêm thông tin về events, xem phần Events and Delegates. Trong ví dụ này, event MouseLeftButtonDown được gắn vào Rectangle để khi người sử dụng click vào rectangle, sự kiện sẽ hiện lên.
<Rectangle MouseLeftButtonDown="Mouse_Clicked" x:Name="MyAnimatedRectangle" Width="100" Height="100" Fill="Blue" />
• Điều khiển hiệu ứng từ Event Handler. Storyboard có một vài phương thức mà cho phép bạn kiểm soát phần phát lại của hiệu ứng Storyboard, bao gồm Begin, Stop, Pause, và Resume. Trong ví dụ này, phương pháp Begin được sử dụng để bắt đầu hiệu ứng khi người sử dụng click vào rectangle và làm hiển thị event MouseLeftButtonDown.
C# Code:
// When the user clicks the Rectangle, the animation
// begins.
private void Mouse_Clicked(object sender, MouseEventArgs e)
{
myStoryboard.Begin();
}
2d. Ví dụ hoàn chỉnh.
Ví dụ sau đây là một đoạn mã XAML hoàn chỉnh, tạo một ô vuông và làm cho nó tăng và giảm dần cường độ ánh sáng:
XAML code:
<UserControl x:Class="animation_ovw_intro.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<StackPanel>
<StackPanel.Resources>
<!-- Animates the rectangle's opacity. -->
<Storyboard x:Name="myStoryboard">
<DoubleAnimation
Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True"
RepeatBehavior="Forever" />
</Storyboard>
</StackPanel.Resources>
<Rectangle MouseLeftButtonDown="Mouse_Clicked"
x:Name="MyAnimatedRectangle"
Width="100" Height="100" Fill="Blue" />
</StackPanel>
</UserControl>
C# Code:
// When the user clicks the Rectangle, the animation
// begins.
private void Mouse_Clicked(object sender, MouseEventArgs e)
{
myStoryboard.Begin();
}
3. Start, Stop, Pause và Resume lại một hiệu ứng:
Ví dụ trước đã chỉ ra cách để bắt đầu một hiệu ứng sử dụng phương thức Begin; tuy nhiên, Storyboard cũng có phương pháp Stop, Pause, và Resume mà có thể được sử dụng để kiểm soát một hiệu ứng. Ví dụ sau sẽ tái hiện một dãy các nút cho phép người sử dụng dùng để kiểm soát hiệu ứng của một Ellipse ngang qua qua màn hình.
XAML code:
<UserControl x:Class="interactive_animation.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Canvas>
<Canvas.Resources>
<Storyboard x:Name="myStoryboard">
<!-- Animate the center point of the ellipse. -->
<PointAnimation Storyboard.TargetProperty="Center"
Storyboard.TargetName="MyAnimatedEllipseGeometry"
Duration="0:0:5"
From="20,200"
To="400,100"
RepeatBehavior="Forever" />
</Storyboard>
</Canvas.Resources>
<Path Fill="Blue">
<Path.Data>
<!-- Describes an ellipse. -->
<EllipseGeometry x:Name="MyAnimatedEllipseGeometry"
Center="20,20" RadiusX="15" RadiusY="15" />
</Path.Data>
</Path>
<StackPanel Orientation="Horizontal" Canvas.Left="10" Canvas.Top="265">
<!-- Button that begins the animation. -->
<Button Click="Animation_Begin"
Width="65" Height="30" Margin="2" Content="Begin" />
<!-- Button that pauses the animation. -->
<Button Click="Animation_Pause"
Width="65" Height="30" Margin="2" Content="Pause" />
<!-- Button that resumes the animation. -->
<Button Click="Animation_Resume"
Width="65" Height="30" Margin="2" Content="Resume" />
<!-- Button that stops the animation. Stopping the animation returns
the ellipse to its original location. -->
<Button Click="Animation_Stop"
Width="65" Height="30" Margin="2" Content="Stop" />
</StackPanel>
</Canvas>
</UserControl>
C# Code:
private void Animation_Begin(object sender, RoutedEventArgs e)
{
myStoryboard.Begin();
}
private void Animation_Pause(object sender, RoutedEventArgs e)
{
myStoryboard.Pause();
}
private void Animation_Resume(object sender, RoutedEventArgs e)
{
myStoryboard.Resume();
}
private void Animation_Stop(object sender, RoutedEventArgs e)
{
myStoryboard.Stop();
}
Xem thử
4. Kiểm soát thời gian bắt đầu của các hiệu ứng
Storyboard cũng như tất cả các đối tượng hiệu ứng khác (DoubleAnimation, DoubleAnimationUsingKeyFrames, ColorAnimation, v.v…) thừa hưởng từ lớp Timeline (xem phần Animations là Timelines được nêu tiếp theo trong chủ đề này). Lớp Timeline đem lại nhiều thuộc tính hữu ích cho những đối tượng hiệu ứng này bao gồm cả thuộc tính BeginTime. Như cái tên đã gợi ý, thuộc tính BeginTime cho phép bạn định ra một thời gian mà tại điểm đó đối tượng hiệu ứng bắt đầu hoạt. Ví dụ, bạn có thể định ra một khoảng thời gian 2 giây trong BeginTime của một Storyboard. Khi bạn bắt đầu Storyboard, sử dụng phương pháp Begin , Storyboard sẽ chờ 2 giây và sau đó sẽ bắt đầu. Thêm vào đó, bạn có thể định rõ BeginTime trên đối tượng hiệu ứng bên trong Storyboard. Ví dụ, nếu bạn có một Storyboard với một BeginTime 2 giây và Storyboard này bao gồm 2 đối tượng DoubleAnimation – một cái không có BeginTime đã được định ra và cái kia có một BeginTime là 3 -- DoubleAnimation đầu tiên sẽ bắt đầu 2 giây sau khi phương pháp Begin được chọn trên Storyboard và DoubleAnimation thứ hai sẽ bắt đầu 5 giây sau đó(2 giây trì hoãn cho Storyboard cộng 3 giây trì hoãn cho DoubleAnimation). Ví dụ sau sẽ minh họa cho điều này.
XAML code:
<StackPanel>
<StackPanel.Resources>
<!-- Storyboard starts 2 seconds after its Begin
method is called. -->
<Storyboard BeginTime="0:0:2" x:Name="myStoryboard">
<!-- Animates the rectangle's width. No
BeginTime specified so by default begins
as soon as it's parent (the Storyboard)
begins. -->
<DoubleAnimation
Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty="Width"
To="300" Duration="0:0:1" />
<!-- Animates the rectangle's opacity. A BeginTime
of 3 seconds specified so begins three seconds
after the Storyboard begins (total of 5 seconds)-->
<DoubleAnimation BeginTime="0:0:3"
Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:1" />
</Storyboard>
</StackPanel.Resources>
<Rectangle x:Name="MyAnimatedRectangle"
Loaded="Start_Animation"
Width="100" Height="100" Fill="Blue" />
</StackPanel>
C# Code:
// Start the animation when the object loads.
private void Start_Animation(object sender, EventArgs e)
{
myStoryboard.Begin();
}
Chạy thử
Bạn có thể coi một Storyboard như là một bộ phận chứa đựng cho các đối tượng hiệu ứng khác (ví dụ như DoubleAnimation) cũng như các đối tượng Storyboard khác. Theo đó, bạn có thể lồng các đối tượng Storyboard với nhau và định ra các giá trị BeginTime cho mỗi Storyboard một cách riêng biệt. Sử dụng một Storyboard đã được lồng ghép có thể giúp bạn tạo ra một loạt các hiệu ứng tinh xảo. Mỗi một Storyboard “con” sẽ chờ cho tới khi Storyboard cha hoạt động và sau đó bắt đầu đếm ngược trước khi đến lượt nó hoạt động.
5. Tạo một hiệu ứng trong mã thủ tục(code behind):
Hơn việc sử dụng XAML, bạn cũng có thể tạo một hiệu ứng hoàn toàn bằng mã thủ tục (như là C# hoặc Visual Basic). Ví dụ sau sẽ chỉ ra cách tạo một hiệu ứng mà sẽ hiệu ứng những thuộc tính gắn kèm Canvas.Top và Canvas.Left của một Rectangle.
private void Create_And_Run_Animation(object sender, EventArgs e)
{
// Create a red rectangle that will be the target
// of the animation.
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 200;
myRectangle.Height = 200;
Color myColor = Color.FromArgb(255, 255, 0, 0);
SolidColorBrush myBrush = new SolidColorBrush();
myBrush.Color = myColor;
myRectangle.Fill = myBrush;
// Add the rectangle to the tree.
LayoutRoot.Children.Add(myRectangle);
// Create a duration of 2 seconds.
Duration duration = new Duration(TimeSpan.FromSeconds(2));
// Create two DoubleAnimations and set their properties.
DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();
DoubleAnimation myDoubleAnimation2 = new DoubleAnimation();
myDoubleAnimation1.Duration = duration;
myDoubleAnimation2.Duration = duration;
Storyboard sb = new Storyboard();
sb.Duration = duration;
sb.Children.Add(myDoubleAnimation1);
sb.Children.Add(myDoubleAnimation2);
Storyboard.SetTarget(myDoubleAnimation1, myRectangle);
Storyboard.SetTarget(myDoubleAnimation2, myRectangle);
// Set the attached properties of Canvas.Left and Canvas.Top
// to be the target properties of the two respective DoubleAnimations.
Storyboard.SetTargetProperty(myDoubleAnimation1, new PropertyPath("(Canvas.Left)"));
Storyboard.SetTargetProperty(myDoubleAnimation2, new PropertyPath("(Canvas.Top)"));
myDoubleAnimation1.To = 200;
myDoubleAnimation2.To = 200;
// Make the Storyboard a resource.
LayoutRoot.Resources.Add("unique_id", sb);
// Begin the animation.
sb.Begin();
}
Chạy thử
Chú ý: Đừng cố gắng chọn phương thức Storyboard, ví dụ như Begin bên trong constructor khi khởi tạo trang. Điều này sẽ làm cho hiệu ứng của bạn thất bại một cách âm thầm.
Mục lục: Hoạt Hoạ Trong Silverlight
[còn nữa- dài wa'














How to use Quote function: