精华内容
下载资源
问答
  • WPF中的动画

    2019-04-03 23:49:00
    WPF中的动画 原文:WPF中的动画WPF中的动画 周银辉...
    原文:WPF中的动画

                                                                   WPF中的动画
                                                                                      周银辉

    动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。

    在WPF中我们采用Storyboard(故事板)的方式来编写动画,为了对Storyboard有个大概的印象,你可以粘贴以下代码到XamlPad来查看效果:

    None.gif<!-- This example shows how to animate with a storyboard.-->
    None.gif
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    None.gif  xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
    None.gif 
    None.gif  WindowTitle
    ="Storyboards Example">
    None.gif  
    <StackPanel Margin="20">
    None.gif    
    None.gif    
    <Rectangle Name="MyRectangle"
    None.gif      Width
    ="100"
    None.gif      Height
    ="100">
    None.gif      
    <Rectangle.Fill>
    None.gif        
    <SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
    None.gif      
    </Rectangle.Fill>
    None.gif      
    <Rectangle.Triggers>
    None.gif        
    <EventTrigger RoutedEvent="Page.Loaded">
    None.gif          
    <BeginStoryboard>
    None.gif            
    <Storyboard RepeatBehavior="Forever" AutoReverse="True">
    None.gif              
    <DoubleAnimation 
    None.gif                
    Storyboard.TargetName="MyRectangle"
    None.gif                Storyboard.TargetProperty
    ="Width"
    None.gif                From
    ="100" To="200" Duration="0:0:1" />              
    None.gif            
    </Storyboard>
    None.gif          
    </BeginStoryboard>
    None.gif        
    </EventTrigger>
    None.gif      
    </Rectangle.Triggers>
    None.gif    
    </Rectangle> 
    None.gif  
    </StackPanel>
    None.gif
    </Page>
    None.gif
    None.gif

    在介绍Storyboard之前应该先了解Animation
    Animation提供一种简单的“渐变”动画,我们为一个Animation指定开始值和一个结束值,并指定由开始值到达结束值所需的时间,便可形成一个简单的动画。比如我们指定长方形的宽度由100变化到200,所需时间为1秒,很容易想像这样的动画是什么样的,而它对应的Xaml代码如下:
    None.gif<DoubleAnimation 
    None.gif                
    Storyboard.TargetName="MyRectangle"
    None.gif                Storyboard.TargetProperty
    ="Width"
    None.gif                From
    ="100" To="200" Duration="0:0:1" />       
    将它翻译成C#代码则如下:
    None.gif DoubleAnimation myDoubleAnimation = new DoubleAnimation();
    None.gif            myDoubleAnimation.From 
    = 100;
    None.gif            myDoubleAnimation.To 
    = 200;
    None.gif            myDoubleAnimation.Duration 
    = new Duration(TimeSpan.FromSeconds(1));
    None.gif            Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
    None.gif            Storyboard.SetTargetProperty(myDoubleAnimation, 
    new PropertyPath(Rectangle.WidthProperty));

    代码里我们定义了一个DoubleAnimation,并指定了它的开始值和结束值以及它由开始值到达结束值所需的时间。至于后面两句,它们是用来将Aniamtion与指定的对象和指定的属性相关联,等会我们将介绍。
    注意到,这里我们使用的是DoubleAnimation,因为我们所要变化的是数值。那么如果我们要变化颜色是不是就用ColorAnimation了呢,对,其实出了这些之外还有PointAnimation等等,并且你可以实现IAnimatable接口来实现自定义版本的Animation。关于这些你可以参见System.Windows.MediaAniamtion名字空间.

    但值得注意的是并非每个属性都能够使用Animation,它必须满足以下条件:
    1,它必须是Dependency Property
    2,它所在类必须继承于DependencyObject,必须实现了IAnimatable接口.
    3,必须有类型一致的Animation Type(即Color类型使用ColorAniamtion,Point类型使用PointAnimation等)

    一个简单的Animation定义了一个简单的动画,很容易想到的是,如果若干个Animation同时作用于一个对象,那么这个对象不就可以表现复杂的动画了吗,对,这就是Storyboard

    Storyboard可以看做是Animation的容器,它包含了若干的简单动画来完成一个复杂动画。
    参考以下代码:

    None.gif<!-- This example shows how to animate with a storyboard.-->
    None.gif
    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    None.gif  xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml"
    None.gif 
    None.gif  WindowTitle
    ="Storyboards Example">
    None.gif  
    <StackPanel Margin="20">
    None.gif    
    None.gif    
    <Rectangle Name="MyRectangle"
    None.gif      Width
    ="100"
    None.gif      Height
    ="100">
    None.gif      
    <Rectangle.Fill>
    None.gif        
    <SolidColorBrush x:Name="MySolidColorBrush" Color="Blue" />
    None.gif      
    </Rectangle.Fill>
    None.gif      
    <Rectangle.Triggers>
    None.gif        
    <EventTrigger RoutedEvent="Page.Loaded">
    None.gif          
    <BeginStoryboard>
    None.gif            
    <Storyboard RepeatBehavior="Forever" AutoReverse="True">
    None.gif              
    <DoubleAnimation 
    None.gif                
    Storyboard.TargetName="MyRectangle"
    None.gif                Storyboard.TargetProperty
    ="Width"
    None.gif                From
    ="100" To="200" Duration="0:0:1" />    
    None.gif              
    <ColorAnimation 
    None.gif                
    Storyboard.TargetName="MySolidColorBrush"
    None.gif                Storyboard.TargetProperty
    ="Color"
    None.gif                From
    ="Blue" To="Red" Duration="0:0:1" />            
    None.gif            
    </Storyboard>
    None.gif          
    </BeginStoryboard>
    None.gif        
    </EventTrigger>
    None.gif      
    </Rectangle.Triggers>
    None.gif    
    </Rectangle> 
    None.gif  
    </StackPanel>
    None.gif
    </Page>
    None.gif
    None.gif

    这里我们的Storyboard定义了DoubleAnimation来变化矩形的宽度,并定义了ColorAnimation来变化矩形的颜色。

    至此,你已经可以编写绚丽的WPF动画了,并推荐你下载Expression Blend来制作WPF动画.



    但你会发现使用XAML标记的方式来编写动画虽然很简单,但缺乏了C#等程序设计语言的灵活性,比如我们的矩形动画中矩形的宽度是由后台逻辑计算出来的变量值,我们的动画将如何编写呢,这时我更喜欢使用C#的方式来编写动画,虽然这所需的代码量更大.
    以下重点介绍如何用C#编写动画,并且这更助于你理解Storyboard是如何工作的。

    参考以下代码:

                this.Name = "PageMain";
                myRectangle.Name 
    = "MyRectangle";  
                
                NameScope.SetNameScope(
    thisnew NameScope());                      
                
    this.RegisterName(myRectangle.Name, myRectangle);

                DoubleAnimation myDoubleAnimation 
    = new DoubleAnimation();
                myDoubleAnimation.From 
    = 100;
                myDoubleAnimation.To 
    = 200;
                myDoubleAnimation.Duration 
    = new Duration(TimeSpan.FromSeconds(1));
                Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
                Storyboard.SetTargetProperty(myDoubleAnimation, 
    new PropertyPath(Rectangle.WidthProperty));
                
                
                Storyboard myStoryboard 
    = new Storyboard();
                myStoryboard.Children.Add(myDoubleAnimation);

                
    this.Loaded += delegate(object sender, MouseEventArgs e)
                {
                    myStoryboard.Begin(
    this);
                };
    其中:

                DoubleAnimation myDoubleAnimation = new DoubleAnimation();
                myDoubleAnimation.From 
    = 100;
                myDoubleAnimation.To 
    = 200;
                myDoubleAnimation.Duration 
    = new Duration(TimeSpan.FromSeconds(1));
    定义了一个DoubleAniamtion,并指定了它的开始值和结束值以及所需的时间.
    Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);设置myDoubleAniamtion的作用对象是"myRectangle",注意到传入的第二个参数是一个字符串myRectangle.Name,那么我们的程序怎么知道"myRectangle"这个字符串就是指我们的矩形对象myRectangle呢,这里存在一个名称与对象的映射,即我们的"myRectangle"映射到矩形对象myRectangle,为了构造这个映射我们涉及到了NameScope(名字域)这个概念.
                NameScope.SetNameScope(thisnew NameScope());                      
                
    this.RegisterName(myRectangle.Name, myRectangle);
    上面的代码中,this设置了一个名字域,myRectagle向这个名字域注册了自己的名字,这样我们的程序就可以通过this的名字域来查找到myRectangle与"myRectangle"之间的映射关系了,关于NameScope可以参见MSDN
    WPF Namescopes主题.
    为了让myDoubleAnimation知道它所作用的属性是谁,我们使用
    Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.WidthProperty));语句来将Aniamtion与属性关联起来,其中PropertyPath中指定要作用的对象所对应的DependencyProperty.
    然后我们将定义好的myDoubleAniamtion添加到myStoryboard的Children中去.最后就可以通过调用Storyboard的Begin(FrameworkElement)方法来开始我们的动画.

    Begin方法的另一个重载形式是
    public Begin (containingObject,isControllable),第二个参数表明我们的storyboard是否是可控的,如果可控的话,我们可以像控制播放器一样控制来控制storyboard,关于控制Storyboard请参考Storyboard类中的Pause,Seek等方法.

    至此也许我们会认为这些知识足以应付简单的动画了,现在让我们一起设计一个简单的动画,也许会发现些问题.

    假设我们的界面中存在一个Button对象button1,我们设计一个简单的动画让它在窗口中的x坐标从0连续变化到100,然后在从100变化到0,如此重复.也许我们会编写如下的代码:

                this.button1.Name = "button1";
                
    this.Name = "window1";
                NameScope.SetNameScope(
    thisnew NameScope());
                
    this.RegisterName(this.button1.Name, this.button1);

                DoubleAnimation xAnimation 
    = new DoubleAnimation();
                xAnimation.From 
    = 0;
                xAnimation.To 
    = 100;
                xAnimation.Duration 
    = new Duration(TimeSpan.FromSeconds(1));

                Storyboard story 
    = new Storyboard();
                story.AutoReverse 
    = true;
                story.RepeatBehavior 
    = RepeatBehavior.Forever;
                story.Children.Add(xAnimation);

                Storyboard.SetTargetName(xAnimation, 
    this.button1.Name);
                Storyboard.SetTargetProperty(xAnimation, 
    ???);
    但当我们编写到Storyboard.SetTargetProperty(xAnimation, ???);时发现似乎不知道将我们的xAniamtion关联到哪个属性.似乎Button中没有用来控制X坐标的DependencyProperty.但通过研究后发现(你可以通过ExpressionBlend自动生成的XAML代码来发现这些信息),如果我们将button1的RenderTransform设置为TranslateTransform,然后可以通过TranslateTransform的XProperty属性来更改button1的X坐标.注意到,我们并不是像以前一样直接关联到Button的某个属性(比如先前的WidthProperty),而是通过其RenderTransformProperty属性的XProperty来间接关联的,这中方式叫做"属性链"(PropertyChain).
    参考下面的代码:
                DependencyProperty[] propertyChain = new DependencyProperty[]
                {
                    Button.RenderTransformProperty,
                    TranslateTransform.XProperty
                };

                Storyboard.SetTargetProperty(xAnimation, 
    new PropertyPath("(0).(1)", propertyChain));
    为了构造PropertyChain,我们先定义一个DependencyProperty的数组,注意数组的元素是怎么来的,它按照属性链的"链条"关系依次书写,直到到达我们最终要修改的属性,(由于我们是通过将RenderTransformProperty设置为TranslateTransform类型,所以第二个元素是TranslateTransform.XProperty),简单地说就是(类型1.属性1,类型2.属性2,....类型n.属性n),其中类型i是属性i-1的类型或可以与之转换的类型.
    这样我们的代码就演化如下:
                this.button1.RenderTransform = new TranslateTransform();

                
    this.button1.Name = "button1";
                
    this.Name = "window1";
                NameScope.SetNameScope(
    thisnew NameScope());
                
    this.RegisterName(this.button1.Name, this.button1);

                DoubleAnimation xAnimation 
    = new DoubleAnimation();
                xAnimation.From 
    = 0;
                xAnimation.To 
    = 100;
                xAnimation.Duration 
    = new Duration(TimeSpan.FromSeconds(1));

                DependencyProperty[] propertyChain 
    = new DependencyProperty[]
                {
                    Button.RenderTransformProperty,
                    TranslateTransform.XProperty
                };

                Storyboard story 
    = new Storyboard();
                story.AutoReverse 
    = true;
                story.RepeatBehavior 
    = RepeatBehavior.Forever;
                story.Children.Add(xAnimation);

                Storyboard.SetTargetName(xAnimation, 
    this.button1.Name);
                Storyboard.SetTargetProperty(xAnimation, 
    new PropertyPath("(0).(1)", propertyChain));

                story.Begin(
    this);
    注意:如果你收到关于PropertyChain的运行时错误或动画没有效果,那么你应该初始化button的RenderTransform属性,所以我们添加了this.button1.RenderTransform = new TranslateTransform();语句.

    更多的,请参见Windows SDK "Storyboard Overview"
    示例程序下载










    posted on 2019-04-03 23:49 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/10652507.html

    展开全文
  • WPF中的动画——序

    2019-10-02 04:28:12
    WPF中的动画功能可以让你非常容易地把动态效果添加到应用程序或者组件中。这也是WPF中最容易被滥用的特性之一。用好了,可以让我们的软件受益匪浅。 在WPF中,动画有着明确的定义:随着时间的推移变化属性的值。...

    WPF中的动画功能可以让你非常容易地把动态效果添加到应用程序或者组件中。这也是WPF中最容易被滥用的特性之一。用好了,可以让我们的软件受益匪浅。

     

    WPF中,动画有着明确的定义:随着时间的推移变化属性的值。因此,为了达到这一目的,可以几种方式来实现。

     

    一、定时器实现动画

    配置一个定时器,然后依据定时器的频率循环地调用它的回调函数。在回调函数中,你可以手工地更新目标的属性值,直到它的最终值。当然,为了达到这一目的,WPF还提供了一个定时器类——DispatcherTimer类。这种方式可能是大家都熟悉的方式,但并不是推荐的办法。定时器无法依据显示器的垂直刷新率进行同步,也不能与WPF渲染引擎同步。

     

    二、Rendering事件

    与定时器实现动画不同,通过为System.Windows.Media.CompositionTarget.Rendering事件添加处理程序,可以实现基于帧的动画。它不是在定制的时间区间引发,而是在布局后和渲染前的每帧引发。

    Rendering事件给出了最好的性能和可定制性。在通常情况下只有当部分UI失效时,WPF才会渲染帧。但是只要Rendering事件上添加了处理程序,WPF就会连续地渲染帧。因此,Rendering对短动画是最好的选择。

     

    三、动画类

    WPFSystem.Windows.Media.Animation命名空间中定义了许多类,它们让你不需要手工地实现Rendering事件,就可以描述和应用动画,成为你简单又得力的帮手。这些类是极其有用的,它们提前告诉你动画会如何表现。

    这些动画有两个重要的方面:

    1)它们只能改变一个依赖属性的值。

    2)它们使动画变得“时间分辨率无关”。动画不会在硬件变快时也变得更快,它们只是会变得更平滑。WPF会基于不同的条件改变帧率,作为动画开发人员,你并不需要关心这一点。

    转载于:https://www.cnblogs.com/xirihanlin/archive/2009/03/01/1401079.html

    展开全文
  • WPF中的动画——(五)路径动画 原文:WPF中的动画——(五)路径动画路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更...
    原文:WPF中的动画——(五)路径动画

    路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了。

    路径动画中最常用的是MatrixAnimationUsingPath,它通常用于控制对象的MatrixTransform,一个简单的例子如下: 

     1     <Canvas >
     2         <Canvas.Resources>
     3             <PathGeometry x:Key="path" Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" />
     4             <Storyboard x:Key="pathStoryboard" >
     5                 <MatrixAnimationUsingPath PathGeometry="{StaticResource path}"
     6                                           Storyboard.TargetName="ButtonMatrixTransform"
     7                                           Storyboard.TargetProperty="Matrix"
     8                                           DoesRotateWithTangent="True"
     9                                           Duration="0:0:5" RepeatBehavior="Forever" >
    10                 </MatrixAnimationUsingPath>
    11             </Storyboard>
    12         </Canvas.Resources>
    13         
    14         <Canvas.Triggers>
    15             <EventTrigger RoutedEvent="Control.Loaded">
    16                 <BeginStoryboard Storyboard="{StaticResource pathStoryboard}" />
    17             </EventTrigger>
    18         </Canvas.Triggers>
    19         
    20         <Path Data="{StaticResource path}" Stroke="Black" StrokeThickness="1" />
    21         
    22         <Button Width="50" Height="20" >
    23             <Button.RenderTransform>
    24                 <MatrixTransform x:Name="ButtonMatrixTransform" />
    25             </Button.RenderTransform>
    26         </Button>
    27     </Canvas>
    View Code

    注意这儿有一个DoesRotateWithTangent的属性,设置上它后,对象在移动的过程中还能根据路径的坡度旋转,非常有用。

    除了MatrixAnimationUsingPath外,另外还有两种路径动画:PointAnimationUsingPath和DoubleAnimationUsingPath。PointAnimationUsingPath用于靠中心点确定位置的形状, 

     1     <Canvas >
     2         <Canvas.Resources>
     3             <PathGeometry x:Key="path" Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" />
     4             <Storyboard x:Key="pathStoryboard" >
     5                 <PointAnimationUsingPath PathGeometry="{StaticResource path}"
     6                                           Storyboard.TargetName="ellipse"
     7                                           Storyboard.TargetProperty="Center"
     8                                           Duration="0:0:5" RepeatBehavior="Forever" >
     9                 </PointAnimationUsingPath>
    10             </Storyboard>
    11         </Canvas.Resources>
    12         
    13         <Canvas.Triggers>
    14             <EventTrigger RoutedEvent="Control.Loaded">
    15                 <BeginStoryboard Storyboard="{StaticResource pathStoryboard}" />
    16             </EventTrigger>
    17         </Canvas.Triggers>
    18         
    19         <Path Data="{StaticResource path}" Stroke="Black" StrokeThickness="1" />
    20         
    21         <Path Fill="Orange">
    22             <Path.Data>
    23                 <EllipseGeometry x:Name="ellipse" Center="5,5" RadiusX="12" RadiusY="12"/>
    24             </Path.Data>
    25         </Path>
    26     </Canvas>
    View Code

     DoubleAnimationUsingPath则是通过X、Y和Angle三个属性联合实现路径的变化,一般在TranslateTransform中使用,如下就是一个简单的例子: 

     1     <Canvas >
     2         <Canvas.Resources>
     3             <PathGeometry x:Key="path" Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" />
     4             <Storyboard x:Key="pathStoryboard" >
     5                 <DoubleAnimationUsingPath PathGeometry="{StaticResource path}"
     6                                           Storyboard.TargetName="translateTransform"
     7                                           Storyboard.TargetProperty="X"
     8                                           Source="X"
     9                                           Duration="0:0:5" RepeatBehavior="Forever" >
    10                 </DoubleAnimationUsingPath>
    11                 <DoubleAnimationUsingPath PathGeometry="{StaticResource path}"
    12                                           Storyboard.TargetName="translateTransform"
    13                                           Storyboard.TargetProperty="Y"
    14                                           Source="Y"
    15                                           Duration="0:0:5" RepeatBehavior="Forever" >
    16                 </DoubleAnimationUsingPath>
    17             </Storyboard>
    18         </Canvas.Resources>
    19         
    20         <Canvas.Triggers>
    21             <EventTrigger RoutedEvent="Control.Loaded">
    22                 <BeginStoryboard Storyboard="{StaticResource pathStoryboard}" />
    23             </EventTrigger>
    24         </Canvas.Triggers>
    25         
    26         <Path Data="{StaticResource path}" Stroke="Black" StrokeThickness="1" />
    27         
    28         <Path Fill="Orange">
    29             <Path.Data>
    30                 <EllipseGeometry x:Name="ellipse" Center="5,5" RadiusX="12" RadiusY="12"/>
    31             </Path.Data>
    32             <Path.RenderTransform>
    33                 <TranslateTransform x:Name="translateTransform" />
    34             </Path.RenderTransform>
    35         </Path>
    36     </Canvas>
    View Code

     这个实现的效果和MatrixAnimationUsingPath类似,但比它用法复杂,很难找到它的使用场景,但由于它的控制维度更多,可能一般用于需要更多的控制的地方吧。

     

    posted on 2018-05-15 08:34 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9039105.html

    展开全文
  • WPF中的动画——(五)关键帧动画 原文:WPF中的动画——(五)关键帧动画与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能...
    原文:WPF中的动画——(五)关键帧动画

    与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个状态之间变化,例如,对于前面那个改变按钮宽度的例子,如果我们要实现如下效果:

    • 在2秒时将宽度从 0变为350
    • 在7秒时将宽度变为50
    • 在9秒的时候将其宽度变为200

    虽然我们可以用三个From/To/By 动画组合实现类似效果,但是这样一来麻烦,二来要感知动画完成事件,不方便在XAML中使用。此时我们则可以使用关键帧动画来快速实现这一过程。

        var widthAnimation = new DoubleAnimationUsingKeyFrames();
        var keyFrames = widthAnimation.KeyFrames;

        keyFrames.Add(new LinearDoubleKeyFrame(0, TimeSpan.FromSeconds(0)));
        keyFrames.Add(new LinearDoubleKeyFrame(350, TimeSpan.FromSeconds(2)));
        keyFrames.Add(new LinearDoubleKeyFrame(50, TimeSpan.FromSeconds(7)));
        keyFrames.Add(new LinearDoubleKeyFrame(200, TimeSpan.FromSeconds(9)));

        button.BeginAnimation(WidthProperty, widthAnimation);

    可以看出,关键帧动画将每一个状态制定为一个关键帧,关键帧动画时间线自动连接各个关键帧,并计算过渡状态,完成动画。因此,某种程度上,我们也可以把From/To/By 动画看成是只有两个状态的特殊关键帧动画。

     

    内置的关键帧动画

    与 From/To/By 动画一样,在名字空间System.Windows.Media.Animation 下也内置了大量关键帧动画,它们的命名规则是:    

        <类型> AnimationUsingKeyFrames

    例如这儿使用的DoubleAnimationUsingKeyFrames,其它类型请参看MSDN:关键帧动画概述,这里就不列举了。

     

    插值算法

    在关键帧动画中,我们除了定义关键帧外,还需要定义两个关键帧之间的插值算法,这样系统才能根据关键帧和插值算法生成中间状态。WPF系统内置四种插值算法:

    • 线性:    两个关键帧之间均匀变化
    • 离散:    两个关键帧之间突变(到达时间点的时候硬切换,没有过渡效果)
    • 样条:    使用贝塞尔曲线实现更精确的加速和减速控制
    • 缓动:    使用缓动函数曲线实现弹性变化

    综上来看,线性算法最常用,样条算法能实现精准加速和减速控制。离散的这种硬切换的效果虽然看起来没有什么动画效果,但用于连接关键帧还是比较常用的。另外在一些硬过渡的地方也是能用到的,例如实现闪烁效果。

    这几种算法的具体效果这里就不做更多的介绍了,感兴趣的朋友可以看看如下两个链接中的描述和例子:

    值得一提的是,并不是所有关键帧动画都支持这几种算法的,具体支持情况请参看MSDN:关键帧动画概述。 当然,对于不支持的也是可以自己手动实现的。

     

     

    关键帧(IKeyFrame)

    前面已经介绍过,一个关键帧主要有时间点和插值算法两部分组成,在WPF中,不同的关键帧动画对应着同的关键帧对象,它们都继承自IKeyFrame接口,其命名规则为:

        <类型> KeyFrame

    例如,DoubleAnimationUsingKeyFrames对应的是DoubleKeyFrame,但由于这个类并没有制定插值算法,它只是一个抽象基类,再加上插值算法后对应的关键帧类命名规范为:

        <插值算法><类型> KeyFrame

    例如,DoubleKeyFrame对应的几种插值算法的关键帧为:LinearDoubleKeyFrame、DiscreteDoubleKeyFrame、SplineDoubleKeyFrame、EasingDoubleKeyFrame。这些关键帧对象使用的方式都比较类似,这里就不多介绍了。

     

    关键帧的时间点(KeyTime)

    关键帧的时间点由IKeyFrame.KeyTime属性指定。它是一个KeyTime类型,它有如下几种取值类型:

    • 时间点TimeSpan: 靠TimeSpan直接决定时间点,可以通过函数KeyTime.FromTimeSpan()创建,也可以直接用TimeSpan隐式转换。
    • 相对时间Percent:  指定的是百分比,通过时间线的Duration来联合决定对应的时间点。通过函数KeyTime.FromPercent()创建。
    • 特殊值Uniform:    时间线平均分布每个关键帧所需要的时间。通过函数KeyTime.Uniform创建
    • 特殊值Paced:      间线按固定的帧率分配所需时间,这种情况下,变化大的关键帧分配时间长,变化小的关键帧分配时间段。通过函数KeyTime.Paced创建

    用代码创建的方式这儿就不举例了,这里就仅仅列举一下如何在XAML中表示这几种时间:

        <LinearDoubleKeyFrame Value="100" KeyTime="0:0:3" />
        <LinearDoubleKeyFrame Value="100" KeyTime="30%" />
        <LinearDoubleKeyFrame Value="100" KeyTime="Uniform" />
        <LinearDoubleKeyFrame Value="100" KeyTime="Paced" />

    参考资料:

    关键帧动画概述

    posted on 2018-05-15 08:33 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9039103.html

    展开全文
  • WPF中的动画——(一)基本概念 原文:WPF中的动画——(一)基本概念WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面。首先,我们来复习一下动画的基本概念。计算机中的动画一般是...
  • WPF中的动画——(二)From/To/By 动画 原文:WPF中的动画——(二)From/To/By 动画我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画:...
  • [转]WPF中的动画

    2014-02-07 17:28:00
    WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard(故事板)的方式来编写动画,为了对Storyboa....
  • WPF中的动画——(六)演示图板 原文:WPF中的动画——(六)演示图板前面所介绍的都是单一的动画,它只能修改单一属性。有的时候,我们需要将一组动画一起进行,对于一个按钮,我们可能有如下需求: ...
  • WPF中的动画——(四)缓动函数 原文:WPF中的动画——(四)缓动函数缓动函数可以通过一系列公式模拟一些物理效果,如实地弹跳或其行为如同在弹簧上一样。它们一般应用在From/To/By动画上,可以使得其...
  • WPF中的动画——(五)关键帧动画 与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值。 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多...
  • WPF中的动画——(一)基本概念 WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面。首先,我们来复习一下动画的基本概念。计算机中的动画一般是定格动画,也称之为逐帧动画,它通过每帧不同的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,495
精华内容 598
关键字:

wpf中的动画