基础知识
(一)动画:是快速播放一系列图像(其中每个图像与下一个图像略微不同)给人造成的一种幻觉
(二)动画类型:两类
(1)From/To/By动画:在起始值和结束值之间进行动画处理。
(2)关键帧动画:在使用关键帧对象指定的一系列值之间播放动画
(三) 动画是时间线:所有动画均继承自 Timeline 对象,因此所有动画都是专用类型的时间线.有以下重要属性:
(1)TargetName:指定要进行动画处理的对象
(2)TargetProperty:指定要进行动画处理的属性
(3)Duration:(时间线)整个动画单次播放持续的时间(格式为 小时 : 分钟 : 秒 或者Forever 或者 Automatic)
(4)AutoReverse:指定时间线在到达其 Duration 的终点后是否倒退(True/Flase)
(5)RepeatBehavior:获取或设置此时间线的重复行为(RepeatBehavior 可以定义为时间跨度字符串、#x 字符串或者特殊值 Forever)。
(6)FillBehavior: 属性指定时间线结束时的行为方式( HoldEnd和Stop) ,默认HoldEnd.如果想保持结束后的状态HoldEnd,否则Stop
(7) BeginTime: 属性可以指定动画对象活动开始点的时间
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:DesignHeight="300" d:DesignWidth="400">
<StackPanel>
<StackPanel.Resources>
<!-- 矩形透明度动画 -->
<Storyboard x:Name="myStoryboard">
<!--
(1)TargetName:指定要进行动画处理的对象
(2)TargetProperty:指定要进行动画处理的属性
(3)Duration:(时间线)整个动画单次播放持续的时间(格式为 小时 : 分钟 : 秒 或者Forever 或者 Automatic)
(4)AutoReverse:指定时间线在到达其 Duration 的终点后是否倒退(True/Flase)
(5)RepeatBehavior:获取或设置此时间线的重复行为(RepeatBehavior 可以定义为时间跨度字符串、#x 字符串或者特殊值 Forever)。
(6)FillBehavior: 属性指定时间线结束时的行为方式( HoldEnd和Stop) ,默认HoldEnd.如果想保持结束后的状态HoldEnd,否则Stop
(7) BeginTime: 属性可以指定动画对象活动开始点的时间
-->
<DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle"
Storyboard.TargetProperty="Opacity" BeginTime="0:0:2"
From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="False"
RepeatBehavior="1x" FillBehavior="HoldEnd" />
</Storyboard>
</StackPanel.Resources>
<TextBlock Margin="10">点击矩形开始动画</TextBlock>
<Rectangle MouseLeftButtonDown="Mouse_Clicked"
x:Name="MyAnimatedRectangle"
Width="100"
Height="100"
Fill="Blue" />
</StackPanel>
</UserControl>
(四) 对属性应用动画
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:DesignHeight="300" d:DesignWidth="400">
<!--对属性应用动画
(1)间接以属性作为目标
正在进行动画处理的属性值 (Color) 属于未命名甚至未显式声明的 SolidColorBrush 对象
Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"
(2)直接属性目标
显式创建 SolidColorBrush,对其进行命名,然后直接以其 Color 属性为目标
-->
<StackPanel x:Name="myStackPanel" Background="Red" Loaded="Start_Animation">
<StackPanel.Resources>
<Storyboard x:Name="colorStoryboard">
<ColorAnimation
BeginTime="00:00:00"
Storyboard.TargetName="myStackPanel"
Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"
From="Red" To="Green" Duration="0:0:4" />
</Storyboard>
</StackPanel.Resources>
</StackPanel>
<!--<StackPanel Loaded="Start_Animation">
<StackPanel.Resources>
<Storyboard x:Name="colorStoryboard">
<ColorAnimation BeginTime="00:00:00" Storyboard.TargetName="mySolidColorBrush"
Storyboard.TargetProperty="Color" From="Red" To="Green" Duration="0:0:4" />
</Storyboard>
</StackPanel.Resources>
<StackPanel.Background>
<SolidColorBrush x:Name="mySolidColorBrush" Color="Red" />
</StackPanel.Background>
</StackPanel>-->
</UserControl>
(五)在程序代码中创建动画,改写(三)中Xaml为程序代码
private void button1_Click(object sender, RoutedEventArgs e)
{
//创建矩形
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 200;
myRectangle.Height = 200;
Color myClolor = Color.FromArgb(255, 255, 0, 0);
SolidColorBrush myBrush = new SolidColorBrush();
myBrush.Color = myClolor;
myRectangle.Fill = myBrush;
LayoutRoot.Children.Add(myRectangle);
//2秒中的时间线
Duration duration = new Duration(TimeSpan.FromSeconds(10));
// 创建DoubleAnimation动画
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.Duration = duration;
//创建演示图版.并将myDoubleAnimation动画加到演示图板
Storyboard sb = new Storyboard();
sb.Duration = duration;
sb.Children.Add(myDoubleAnimation);
//设置动画对象和动画属性
Storyboard.SetTarget(myDoubleAnimation, myRectangle);
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(OpacityProperty));
myDoubleAnimation.To =0.0;
sb.BeginTime = new TimeSpan(0, 0, 0, 2);
sb.RepeatBehavior = new RepeatBehavior(3);
myDoubleAnimation.AutoReverse = false;
myDoubleAnimation.FillBehavior = FillBehavior.HoldEnd;
//以资源文件加入到LayOutRoot
LayoutRoot.Resources.Add("123",sb);
//开始动画
sb.Begin();
}