共用方式為


路徑動畫概觀

本主題將介紹路徑動畫,它可讓您使用幾何路徑來產生輸出值。 路徑動畫很適合用來沿著複雜路徑移動和旋轉物件。

必要條件

若要了解本主題,您應該熟悉 WPF 動畫功能。 如需動畫功能的簡介,請參閱 動畫概觀

因為您使用 PathGeometry 物件來定義路徑動畫,所以您也應該熟悉 PathGeometry 和不同類型的 PathSegment 物件。 如需詳細資訊,請參閱 幾何概觀

什麼是路徑動畫?

路徑動畫是 AnimationTimeline 的類型,會使用 PathGeometry 做為其輸入。 相對於 (針對 From/To/By 動畫) 設定 From、To 或 By 屬性,或 (針對主要畫面格動畫) 使用主要畫面格,您會定義幾何路徑並使用其設定路徑動畫的 PathGeometry 屬性。 路徑動畫進行時,它會讀取路徑中的 X、Y 和角度資訊,並使用該資訊產生其輸出。

路徑動畫非常適合用來沿著複雜路徑建立物件的動畫。 沿著路徑移動物件的其中一種方式,是使用 MatrixTransformMatrixAnimationUsingPath,沿著複雜路徑轉換物件。 下列範例示範這項技術,方法是使用 MatrixAnimationUsingPath 物件以動畫顯示 MatrixMatrixTransform 屬性。 MatrixTransform 會套用至按鈕並使其沿曲線路徑移動。 DoesRotateWithTangent 由於屬性設定為 true,因此矩形會沿著路徑的正切值旋轉。

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions" Margin="20">
  <Canvas Width="400" Height="400">
      
    <!-- The Button that is animated across the screen by animating
         the MatrixTransform applied to the button. -->
    <Button MinWidth="100" Content="A Button">
      <Button.RenderTransform>
        <MatrixTransform x:Name="ButtonMatrixTransform">
          <MatrixTransform.Matrix >
            <Matrix />
          </MatrixTransform.Matrix>
        </MatrixTransform>
      </Button.RenderTransform>
      <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Loaded">
          <BeginStoryboard>
            <Storyboard>
              <MatrixAnimationUsingPath
              Storyboard.TargetName="ButtonMatrixTransform"
              Storyboard.TargetProperty="Matrix"
              DoesRotateWithTangent="True"
              Duration="0:0:5" 
              RepeatBehavior="Forever" >
                <MatrixAnimationUsingPath.PathGeometry>
                  <PathGeometry 
                    Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" 
                    PresentationOptions:Freeze="True" />
                </MatrixAnimationUsingPath.PathGeometry>
              </MatrixAnimationUsingPath>
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Button.Triggers>
    </Button>
  </Canvas>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SDKSample
{

    /// <summary>
    /// Shows how to animate an object along
    /// a geometric path.
    /// </summary>
    public class MatrixAnimationUsingPathDoesRotateWithTangentExample : Page
    {

        public MatrixAnimationUsingPathDoesRotateWithTangentExample()
        {
            this.Margin = new Thickness(20);

            // Create a NameScope for the page so that
            // we can use Storyboards.
            NameScope.SetNameScope(this, new NameScope());

            // Create a button.
            Button aButton = new Button();
            aButton.MinWidth = 100;
            aButton.Content = "A Button";

            // Create a MatrixTransform. This transform
            // will be used to move the button.
            MatrixTransform buttonMatrixTransform = new MatrixTransform();
            aButton.RenderTransform = buttonMatrixTransform;

            // Register the transform's name with the page
            // so that it can be targeted by a Storyboard.
            this.RegisterName("ButtonMatrixTransform", buttonMatrixTransform);

            // Create a Canvas to contain the button
            // and add it to the page.
            // Although this example uses a Canvas,
            // any type of panel will work.
            Canvas mainPanel = new Canvas();
            mainPanel.Width = 400;
            mainPanel.Height = 400;
            mainPanel.Children.Add(aButton);
            this.Content = mainPanel;

            // Create the animation path.
            PathGeometry animationPath = new PathGeometry();
            PathFigure pFigure = new PathFigure();
            pFigure.StartPoint = new Point(10, 100);
            PolyBezierSegment pBezierSegment = new PolyBezierSegment();
            pBezierSegment.Points.Add(new Point(35, 0));
            pBezierSegment.Points.Add(new Point(135, 0));
            pBezierSegment.Points.Add(new Point(160, 100));
            pBezierSegment.Points.Add(new Point(180, 190));
            pBezierSegment.Points.Add(new Point(285, 200));
            pBezierSegment.Points.Add(new Point(310, 100));
            pFigure.Segments.Add(pBezierSegment);
            animationPath.Figures.Add(pFigure);

            // Freeze the PathGeometry for performance benefits.
            animationPath.Freeze();

            // Create a MatrixAnimationUsingPath to move the
            // button along the path by animating
            // its MatrixTransform.
            MatrixAnimationUsingPath matrixAnimation =
                new MatrixAnimationUsingPath();
            matrixAnimation.PathGeometry = animationPath;
            matrixAnimation.Duration = TimeSpan.FromSeconds(5);
            matrixAnimation.RepeatBehavior = RepeatBehavior.Forever;

            // Set the animation's DoesRotateWithTangent property
            // to true so that rotates the rectangle in addition
            // to moving it.
            matrixAnimation.DoesRotateWithTangent = true;

            // Set the animation to target the Matrix property
            // of the MatrixTransform named "ButtonMatrixTransform".
            Storyboard.SetTargetName(matrixAnimation, "ButtonMatrixTransform");
            Storyboard.SetTargetProperty(matrixAnimation,
                new PropertyPath(MatrixTransform.MatrixProperty));

            // Create a Storyboard to contain and apply the animation.
            Storyboard pathAnimationStoryboard = new Storyboard();
            pathAnimationStoryboard.Children.Add(matrixAnimation);

            // Start the storyboard when the button is loaded.
            aButton.Loaded += delegate(object sender, RoutedEventArgs e)
            {
                // Start the storyboard.
                pathAnimationStoryboard.Begin(this);
            };
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes


Namespace SDKSample

    ''' <summary>
    ''' Shows how to animate an object along
    ''' a geometric path.
    ''' </summary>
    Public Class MatrixAnimationUsingPathDoesRotateWithTangentExample
        Inherits Page

        Public Sub New()
            Me.Margin = New Thickness(20)

            ' Create a NameScope for the page so that
            ' we can use Storyboards.
            NameScope.SetNameScope(Me, New NameScope())

            ' Create a button.
            Dim aButton As New Button()
            aButton.MinWidth = 100
            aButton.Content = "A Button"

            ' Create a MatrixTransform. This transform
            ' will be used to move the button.
            Dim buttonMatrixTransform As New MatrixTransform()
            aButton.RenderTransform = buttonMatrixTransform

            ' Register the transform's name with the page
            ' so that it can be targeted by a Storyboard.
            Me.RegisterName("ButtonMatrixTransform", buttonMatrixTransform)

            ' Create a Canvas to contain the button
            ' and add it to the page.
            ' Although this example uses a Canvas,
            ' any type of panel will work.
            Dim mainPanel As New Canvas()
            mainPanel.Width = 400
            mainPanel.Height = 400
            mainPanel.Children.Add(aButton)
            Me.Content = mainPanel

            ' Create the animation path.
            Dim animationPath As New PathGeometry()
            Dim pFigure As New PathFigure()
            pFigure.StartPoint = New Point(10, 100)
            Dim pBezierSegment As New PolyBezierSegment()
            pBezierSegment.Points.Add(New Point(35, 0))
            pBezierSegment.Points.Add(New Point(135, 0))
            pBezierSegment.Points.Add(New Point(160, 100))
            pBezierSegment.Points.Add(New Point(180, 190))
            pBezierSegment.Points.Add(New Point(285, 200))
            pBezierSegment.Points.Add(New Point(310, 100))
            pFigure.Segments.Add(pBezierSegment)
            animationPath.Figures.Add(pFigure)

            ' Freeze the PathGeometry for performance benefits.
            animationPath.Freeze()

            ' Create a MatrixAnimationUsingPath to move the
            ' button along the path by animating
            ' its MatrixTransform.
            Dim matrixAnimation As New MatrixAnimationUsingPath()
            matrixAnimation.PathGeometry = animationPath
            matrixAnimation.Duration = TimeSpan.FromSeconds(5)
            matrixAnimation.RepeatBehavior = RepeatBehavior.Forever

            ' Set the animation's DoesRotateWithTangent property
            ' to true so that rotates the rectangle in addition
            ' to moving it.
            matrixAnimation.DoesRotateWithTangent = True

            ' Set the animation to target the Matrix property
            ' of the MatrixTransform named "ButtonMatrixTransform".
            Storyboard.SetTargetName(matrixAnimation, "ButtonMatrixTransform")
            Storyboard.SetTargetProperty(matrixAnimation, New PropertyPath(MatrixTransform.MatrixProperty))

            ' Create a Storyboard to contain and apply the animation.
            Dim pathAnimationStoryboard As New Storyboard()
            pathAnimationStoryboard.Children.Add(matrixAnimation)

            ' Start the storyboard when the button is loaded.
            AddHandler aButton.Loaded, Sub(sender As Object, e As RoutedEventArgs) pathAnimationStoryboard.Begin(Me)



        End Sub
    End Class
End Namespace

如需 XAML 範例中所使用路徑語法的詳細資訊,請參閱路徑標記語法概觀。 如需完整的範例,請參閱 路徑動畫範例

您可以在 XAML 和程式碼中使用 Storyboard,或在程式碼中使用 BeginAnimation 方法,將路徑動畫套用至屬性。 您也可以使用路徑動畫建立 AnimationClock,然後將其套用至一或多個屬性。 如需套用動畫之不同方法的詳細資訊,請參閱 屬性動畫技術概觀

路徑動畫類型

由於動畫會產生屬性值,因此針對不同的屬性類型會有不同的動畫類型。 若要以動畫顯示採用 Double 的屬性 (例如 XTranslateTransform 屬性),請使用會產生 Double 值的動畫。 若要以動畫顯示採用 Point 的屬性,您可以使用會產生 Point 值的動畫,依此類推。

路徑動畫類別屬於 System.Windows.Media.Animation 命名空間,並使用下列命名慣例:

<Type>AnimationUsingPath

其中 <Type> 是該類別建立動畫的值類型。

WPF 提供下列路徑動畫類別。

屬性類型 對應路徑動畫類別 範例
Double DoubleAnimationUsingPath 沿著路徑建立物件的動畫 (Double 動畫)
Matrix MatrixAnimationUsingPath 沿著路徑建立物件的動畫 (矩陣動畫)
Point PointAnimationUsingPath 沿著路徑建立物件的動畫 (點動畫)

MatrixAnimationUsingPath 會從其 Matrix 產生 PathGeometry 值。 搭配 MatrixTransform 使用時,MatrixAnimationUsingPath 可以沿著路徑移動物件。 如果您將 DoesRotateWithTangentMatrixAnimationUsingPath 屬性設定為 true,則其也會沿著路徑的曲線旋轉物件。

PointAnimationUsingPath 會從其 Point 的 x 和 y 座標產生 PathGeometry 值。 您可以使用 PointAnimationUsingPath 以動畫顯示接受 Point 值的屬性,沿著路徑移動物件。 PointAnimationUsingPath 無法旋轉物件。

DoubleAnimationUsingPath 會從其 Double 產生 PathGeometry 值。 您可以設定 Source 屬性,指定 DoubleAnimationUsingPath 是使用 X 座標、Y 座標還是路徑的角度做為其輸出。 您可以使用 DoubleAnimationUsingPath 來旋轉物件,或沿著 X 軸或 Y 軸移動物件。

路徑動畫輸入

每個路徑動畫類別都會提供 PathGeometry 屬性來指定其輸入。 路徑動畫會使用 PathGeometry 來產生其輸出值。 PathGeometry 類別可讓您描述由弧線、曲線和線條所組成的複雜圖表。

PathGeometry 的核心是 PathFigure 物件的集合;這些物件如此命名,是因為每個圖表都會描述 PathGeometry 中的離散圖形。 每個 PathFigure 都包含一或多個 PathSegment 物件,其中每一個物件都會描述圖表的線段。

區段的類型繁多。

區段類型 描述
ArcSegment 在兩個點之間建立橢圓形弧線。
BezierSegment 在兩個點之間建立三次方貝茲曲線。
LineSegment 在兩個點之間建立線條。
PolyBezierSegment 建立一系列三次方貝茲曲線。
PolyLineSegment 建立一系列的線條。
PolyQuadraticBezierSegment 建立一系列二次方貝茲曲線。
QuadraticBezierSegment 建立二次方貝茲曲線。

PathFigure 中的線段會結合成單一幾何圖形,這個圖形會使用區段的結束點做為下一個線段的起始點。 StartPointPathFigure 屬性會指定繪製第一個線段的點。 每個後續區段都會從前一個區段的結束點開始。 例如,將 10,50 屬性設定為 10,150,並使用 StartPoint 的屬性設定 10,50 來建立 LineSegment,即可定義從 Point10,150 的直立線符號。

如需有關 PathGeometry 物件的詳細資訊,請參閱幾何概觀

在 XAML 中,您也可以使用特殊的縮寫語法來設定 FiguresPathGeometry 屬性。 如需詳細資訊,請參閱 路徑標記語法概觀。

如需 XAML 範例中所使用路徑語法的詳細資訊,請參閱路徑標記語法概觀。

另請參閱