• 稳扎稳打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
    [源码下载]
  • 相关阅读:
    棋盘问题 简单搜索DFS
    Equivalent Strings
    素数环
    LeetCode Maximum Product Subarray
    UVA 725 – Division
    矩形嵌套问题
    ACM最大子串和问题
    ACM装箱问题
    ACM田胫赛马
    ACM雷达安放问题
  • 原文地址:https://www.cnblogs.com/webabcd/p/1327758.html
Copyright © 2020-2023  润新知