稳扎稳打Silverlight(11) - 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画

[索引页]
[源码下载]


稳扎稳打Silverlight(11) - 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画


作者: webabcd


介绍
Silverlight 2.0 动画:
    ColorAnimation - 在两个 Color 值之间做线性内插动画处理
    DoubleAnimation - 在两个 Double 值之间做线性内插动画处理
    PointAnimation - 在两个 Point 值之间做线性内插动画处理
    内插关键帧动画 - 在 Color 或 Double 或 Point 动画中内插关键帧,以做线性, 离散, 三次贝塞尔曲线的动画处理
    动态改变动画 - 通过程序控制,动态地改变动画


在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


示例
1、ColorAnimation.xaml
< UserControl  x:Class ="Silverlight20.Animation.ColorAnimation"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left" >

        
< Ellipse  x:Name ="ellipse"  Fill ="Red"  Width ="200"  Height ="100" >
            
< Ellipse.Triggers >
            
                
<!--
                RoutedEvent - 所属对象的路由事件,仅有Loaded这个事件
                
-->
                
< EventTrigger  RoutedEvent ="Ellipse.Loaded" >
                    
< BeginStoryboard  x:Name ="beginStoryboard" >
                        
< Storyboard  x:Name ="storyboard" >
                        
                            
<!-- ColorAnimation - 在两个 Color 值之间做线性内插动画处理 -->
                            
<!--
                            Storyboard.TargetName - 要进行动画处理的对象的名称
                            Storyboard.TargetProperty - 要进行动画处理的对象的属性
                            BeginTime - 时间线在被触发 BeginTime 的时间后才能开始播放
                                TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数](可为正;可为负;可为空;默认值为 0)
                            From - 动画的起始值
                            To - 动画的结束值
                            By - 动画从起始值开始计算,所需变化的总量(To 优先于 By)
                            Duration - 时间线的持续时间
                                TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                                Automatic - 自动确定
                                Forever - 无限长
                            AutoReverse - 动画完成后是否要原路返回。默认值为 false
                            RepeatBehavior - 动画重复播放的时间、次数或类型
                                TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                                nx - 播放次数。1x, 2x, 3x 
                                Forever - 永久播放
                            SpeedRatio - 时间线的速率的倍数。默认值 1
                            FillBehavior - 动画结束后的行为 [System.Windows.Media.Animation.FillBehavior枚举]
                                FillBehavior.HoldEnd - 动画结束后,保留动画属性的结束值。默认值
                                FillBehavior.Stop - 动画结束后,恢复动画属性为其初始值
                            
-->
                            
< ColorAnimation 
                                
Storyboard.TargetName ="ellipse"  
                                Storyboard.TargetProperty
="(Ellipse.Fill).(SolidColorBrush.Color)"  
                                BeginTime
="00:00:0"  
                                From
="Red"  
                                To
="Yellow"  
                                Duration
="Automatic"  
                                AutoReverse
="True"  
                                RepeatBehavior
="3x" >
                            
</ ColorAnimation >
                        
</ Storyboard >
                    
</ BeginStoryboard >
                
</ EventTrigger >
            
</ Ellipse.Triggers >
        
</ Ellipse >

    
</ StackPanel >
</ UserControl >


2、DoubleAnimation.xaml
< UserControl  x:Class ="Silverlight20.Animation.DoubleAnimation"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left" >
    
        
< Rectangle  x:Name ="rectangle"  Width ="200"  Height ="100"  Stroke ="Black"  StrokeThickness ="6"  RadiusX ="25"  RadiusY ="25" >
            
< Rectangle.Fill >
                
< ImageBrush  ImageSource ="/Silverlight20;component/Images/Logo.jpg"  Stretch ="Fill"   />
            
</ Rectangle.Fill >
        
</ Rectangle >
        
        
< StackPanel.Resources >
            
< BeginStoryboard  x:Name ="beginStoryboard" >
                
< Storyboard  x:Name ="storyboard" >

                    
<!-- DoubleAnimation - 在两个 Double 值之间做线性内插动画处理 -->
                    
<!--
                    Storyboard.TargetName - 要进行动画处理的对象的名称
                    Storyboard.TargetProperty - 要进行动画处理的对象的属性
                    BeginTime - 时间线在被触发 BeginTime 的时间后才能开始播放
                        TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数](可为正;可为负;可为空;默认值为 0)
                    From - 动画的起始值
                    To - 动画的结束值
                    By - 动画从起始值开始计算,所需变化的总量(To 优先于 By)
                    Duration - 时间线的持续时间
                        TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                        Automatic - 自动确定
                        Forever - 无限长
                    AutoReverse - 动画完成后是否要原路返回。默认值为 false
                    RepeatBehavior - 动画重复播放的时间、次数或类型
                        TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                        nx - 播放次数。1x, 2x, 3x 
                        Forever - 永久播放
                    SpeedRatio - 时间线的速率的倍数。默认值 1
                    FillBehavior - 动画结束后的行为 [System.Windows.Media.Animation.FillBehavior枚举]
                        FillBehavior.HoldEnd - 动画结束后,保留动画属性的结束值。默认值
                        FillBehavior.Stop - 动画结束后,恢复动画属性为其初始值
                    
-->
                    
< DoubleAnimation 
                        
Storyboard.TargetName ="rectangle"  
                        Storyboard.TargetProperty
="Width"
                        From
="100"
                        By
="100"
                        BeginTime
="0:0:3"
                        Duration
="00:00:03"
                        AutoReverse
="False"
                        RepeatBehavior
="Forever" >
                    
</ DoubleAnimation >
                
</ Storyboard >
            
</ BeginStoryboard >
        
</ StackPanel.Resources >
        
    
</ StackPanel >
</ UserControl >


3、PointAnimation.xaml
< UserControl  x:Class ="Silverlight20.Animation.PointAnimation"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left" >
    
        
< StackPanel  Orientation ="Horizontal" >

            
< Button  Click ="Animation_Begin"  Width ="65"  Height ="30"  Margin ="2"  Content ="Begin"   />

            
< Button  Click ="Animation_Pause"  Width ="65"  Height ="30"  Margin ="2"  Content ="Pause"   />

            
< Button  Click ="Animation_Resume"  Width ="65"  Height ="30"  Margin ="2"  Content ="Resume"   />

            
< Button  Click ="Animation_Stop"  Width ="65"  Height ="30"  Margin ="2"  Content ="Stop"   />
            
        
</ StackPanel >
    
        
< Path  Fill ="Red" >
            
< Path.Data >
                
< EllipseGeometry  x:Name ="ellipseGeometry"  Center ="50,50"  RadiusX ="15"  RadiusY ="15"   />
            
</ Path.Data >
        
</ Path >
        
        
< StackPanel.Resources >
            
< Storyboard  x:Name ="storyboard" >

                
<!-- PointAnimation - 在两个 Point 值之间做线性内插动画处理 -->
                
<!--
                Storyboard.TargetName - 要进行动画处理的对象的名称
                Storyboard.TargetProperty - 要进行动画处理的对象的属性
                BeginTime - 时间线在被触发 BeginTime 的时间后才能开始播放
                    TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数](可为正;可为负;可为空;默认值为 0)
                From - 动画的起始值
                To - 动画的结束值
                By - 动画从起始值开始计算,所需变化的总量(To 优先于 By)
                Duration - 时间线的持续时间
                    TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                    Automatic - 自动确定
                    Forever - 无限长
                AutoReverse - 动画完成后是否要原路返回。默认值为 false
                RepeatBehavior - 动画重复播放的时间、次数或类型
                    TimeSpan - [-][日.]时:分:秒[.1位到7为的秒后的小数]
                    nx - 播放次数。1x, 2x, 3x 
                    Forever - 永久播放
                SpeedRatio - 时间线的速率的倍数。默认值 1
                FillBehavior - 动画结束后的行为 [System.Windows.Media.Animation.FillBehavior枚举]
                    FillBehavior.HoldEnd - 动画结束后,保留动画属性的结束值。默认值
                    FillBehavior.Stop - 动画结束后,恢复动画属性为其初始值
                
-->
                
< PointAnimation
                    
Storyboard.TargetName ="ellipseGeometry"
                    Storyboard.TargetProperty
="Center"
                    BeginTime
="00:00:00"
                    From
="50,50"
                    To
="300,500"
                    Duration
="0:0:3"
                    AutoReverse
="True"
                    RepeatBehavior
="00:00:10" >
                
</ PointAnimation >
            
</ Storyboard >
        
</ StackPanel.Resources >
        
    
</ StackPanel >
</ UserControl >

PointAnimation.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Animation
{
    
public partial class PointAnimation : UserControl
    
{
        
public PointAnimation()
        
{
            InitializeComponent();
        }


        
private void Animation_Begin(object sender, RoutedEventArgs e)
        
{
            
// 播放
            storyboard.Begin();
        }


        
private void Animation_Pause(object sender, RoutedEventArgs e)
        
{
            
// 暂停
            storyboard.Pause();
        }


        
private void Animation_Resume(object sender, RoutedEventArgs e)
        
{
            
// 继续
            storyboard.Resume();
        }


        
private void Animation_Stop(object sender, RoutedEventArgs e)
        
{
            
// 停止
            storyboard.Stop();
        }

    }

}



4、KeyFrame.xaml
< UserControl  x:Class ="Silverlight20.Animation.KeyFrame"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left" >
    
        
<!--
        ColorAnimationUsingKeyFrames - 在一组 KeyFrame 中所设置的多个 Color 值之间做动画处理
        DoubleAnimationUsingKeyFrames - 在一组 KeyFrame 中所设置的多个 Double 值之间做动画处理
        PointAnimationUsingKeyFrames - 在一组 KeyFrame 中所设置的多个 Point 值之间做动画处理
        
-->
        
        
<!--
        LinearColorKeyFrame - 在前一个关键帧的 Color 值及其自己的 Value 之间进行线性内插动画处理
        DiscreteColorKeyFrame - 在前一个关键帧的 Color 值及其自己的 Value 之间进行离散内插动画处理
        SplineColorKeyFrame - 在前一个关键帧的 Color 值及其自己的 Value 之间按 三次贝塞尔曲线 进行内插动画处理
        
        LinearDoubleKeyFrame - 在前一个关键帧的 Double 值及其自己的 Value 之间进行线性内插动画处理
        DiscreteDoubleKeyFrame - 在前一个关键帧的 Double 值及其自己的 Value 之间进行离散内插动画处理
        SplineDoubleKeyFrame - 在前一个关键帧的 Double 值及其自己的 Value 之间按 三次贝塞尔曲线 进行内插动画处理
        
        LinearPointKeyFrame - 在前一个关键帧的 Point 值及其自己的 Value 之间进行线性内插动画处理
        DiscretePointKeyFrame - 在前一个关键帧的 Point 值及其自己的 Value 之间进行离散内插动画处理
        SplinePointKeyFrame - 在前一个关键帧的 Point 值及其自己的 Value 之间按 三次贝塞尔曲线 进行内插动画处理
        
-->
        
        
<!--
        Value - 关键帧的目标值
        KeyTime - 到达关键帧目标值的时间
        KeySpline - 三次贝塞尔曲线的两个控制点:x1,y1 x2,y2(该三次贝塞尔曲线的起点为0,0,终点为1,1)
        
-->
    
        
< Grid  Margin ="5"   >
            
< Grid.Resources >
                
< Storyboard  x:Name ="caStoryboard" >
                    
< ColorAnimationUsingKeyFrames
                        
Storyboard.TargetName ="caBrush"
                        Storyboard.TargetProperty
="Color"
                        Duration
="0:0:10"
                    
>
                        
< LinearColorKeyFrame  Value ="Green"  KeyTime ="0:0:3"   />
                        
< DiscreteColorKeyFrame  Value ="Blue"  KeyTime ="0:0:4"   />
                        
< SplineColorKeyFrame  Value ="Red"  KeySpline ="0.6,0.0 0.9,0.00"  KeyTime ="0:0:6"   />
                    
</ ColorAnimationUsingKeyFrames >
                
</ Storyboard >
            
</ Grid.Resources >

            
< Rectangle  x:Name ="caRectangle"  MouseLeftButtonDown ="caRectangle_MouseLeftButtonDown"  Width ="100"  Height ="50" >
                
< Rectangle.Fill >
                    
< SolidColorBrush  x:Name ="caBrush"  Color ="Red"   />
                
</ Rectangle.Fill >
            
</ Rectangle >
        
</ Grid >

        
< Grid  Margin ="5"   >
            
< Grid.Resources >
                
< Storyboard  x:Name ="daStoryboard" >
                    
< DoubleAnimationUsingKeyFrames
                        
Storyboard.TargetName ="daTransform"
                        Storyboard.TargetProperty
="X"
                        Duration
="0:0:10"
                    
>
                        
< LinearDoubleKeyFrame  Value ="500"  KeyTime ="0:0:3"   />
                        
< DiscreteDoubleKeyFrame  Value ="400"  KeyTime ="0:0:4"   />
                        
< SplineDoubleKeyFrame  Value ="0"  KeySpline ="0.6,0.0 0.9,0.00"  KeyTime ="0:0:6"   />
                    
</ DoubleAnimationUsingKeyFrames >
                
</ Storyboard >
            
</ Grid.Resources >

            
< Rectangle  x:Name ="daRectangle"  MouseLeftButtonDown ="daRectangle_MouseLeftButtonDown"  Fill ="Red"  Width ="100"  Height ="50" >
                
< Rectangle.RenderTransform >
                    
< TranslateTransform  x:Name ="daTransform"  X ="0"  Y ="0"   />
                
</ Rectangle.RenderTransform >
            
</ Rectangle >
        
</ Grid >

        
< Grid  Margin ="5"   >
            
< Grid.Resources >
                
< Storyboard  x:Name ="paStoryboard" >
                    
< PointAnimationUsingKeyFrames
                        
Storyboard.TargetName ="paGeometry"
                        Storyboard.TargetProperty
="Center"
                        Duration
="0:0:10"
                    
>
                        
< LinearPointKeyFrame  Value ="100,100"  KeyTime ="0:0:3"   />
                        
< DiscretePointKeyFrame  Value ="200,200"  KeyTime ="0:0:4"   />
                        
< SplinePointKeyFrame  Value ="50,50"  KeySpline ="0.6,0.0 0.9,0.00"  KeyTime ="0:0:6"   />
                    
</ PointAnimationUsingKeyFrames >
                
</ Storyboard >
            
</ Grid.Resources >

            
< Path  Fill ="Red"  MouseLeftButtonDown ="paPath_MouseLeftButtonDown" >
                
< Path.Data >
                    
< EllipseGeometry  x:Name ="paGeometry"  Center ="50,50"  RadiusX ="15"  RadiusY ="15"   />
                
</ Path.Data >
            
</ Path >
        
</ Grid >
    
</ StackPanel >
</ UserControl >

KeyFrame.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Animation
{
    
public partial class KeyFrame : UserControl
    
{
        
public KeyFrame()
        
{
            InitializeComponent();
        }


        
private void caRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            caStoryboard.Begin();
        }


        
private void daRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            daStoryboard.Begin();
        }


        
private void paPath_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            paStoryboard.Begin();
        }

    }

}



5、Programmatically.xaml
< UserControl  x:Class ="Silverlight20.Animation.Programmatically"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< StackPanel  HorizontalAlignment ="Left" >

        
<!--
        MouseLeftButtonDown - 在该Canvas上单击鼠标后所执行的事件
        
-->
        
< Canvas  x:Name ="canvas"  Background ="Yellow"  Width ="640"  Height ="480"  MouseLeftButtonDown ="Canvas_MouseLeftButtonDown" >
            
< Path  Fill ="Red" >
                
< Path.Data >
                    
< EllipseGeometry  x:Name ="ellipseGeometry"  Center ="200,100"  RadiusX ="15"  RadiusY ="15"   />
                
</ Path.Data >
            
</ Path >
        
</ Canvas >

        
< StackPanel.Resources >
            
< Storyboard  x:Name ="storyboard" >
                
< PointAnimation 
                    
x:Name ="pointAnimation"
                    Storyboard.TargetProperty
="Center"
                    Storyboard.TargetName
="ellipseGeometry"
                    Duration
="0:0:2" />
            
</ Storyboard >
        
</ StackPanel.Resources >
    
</ StackPanel >

</ UserControl >

Programmatically.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Animation
{
    
public partial class Programmatically : UserControl
    
{
        
public Programmatically()
        
{
            InitializeComponent();
        }


        
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
{
            
// 鼠标相对与canvas的坐标
            double newX = e.GetPosition(canvas).X;
            
double newY = e.GetPosition(canvas).Y;
            Point myPoint 
= new Point(newX, newY);

            
// 将动画的结束值设置为鼠标的当前坐标
            pointAnimation.To = myPoint;

            
// 播放动画
            storyboard.Begin();
        }

    }

}



OK
[源码下载]

你可能感兴趣的:(silverlight)