zoukankan      html  css  js  c++  java
  • 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类似,但比它用法复杂,很难找到它的使用场景,但由于它的控制维度更多,可能一般用于需要更多的控制的地方吧。

  • 相关阅读:
    小账本软件设计之数据库设计模式构建
    基于JMeter的Quick Easy FTP Server性能测试
    构建之法 -源代码管理
    小账本APP——软件项目风险管理及解决办法案例
    基于python的Splash基本使用和负载均衡配置
    MQ初窥门径【面试必看的Kafka和RocketMQ存储区别】
    Apollo源码搭建调试看一文就够
    log4j2异步日志解读(二)AsyncLogger
    Disruptor源码解读
    高性能队列disruptor为什么这么快?
  • 原文地址:https://www.cnblogs.com/TianFang/p/4071954.html
Copyright © 2011-2022 走看看