共用方式為


路徑動畫概觀

更新:2007 年 11 月

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

本主題包含下列章節。

必要條件

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

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

什麼是路徑動畫

路徑動畫是一種 AnimationTimeline,會使用 PathGeometry 做為其輸出。您不會設定 From、To 或 By 屬性 (如 From/To/By 動畫) 或使用主要畫面格 (如主要畫面格動畫),而是定義幾何路徑並用它來設定路徑動畫的 PathGeometry 屬性。隨著路徑動畫進行,它會從路徑讀取 X、Y 和角度資訊,然後使用這些資訊產生其輸出。

路徑動畫很適合用來沿著複雜路徑顯示物件的動畫。沿著路徑移動物件的一種方法是使用 MatrixTransformMatrixAnimationUsingPath 沿著複雜路徑轉換物件。下列範例即示範這種方法,使用 MatrixAnimationUsingPath 物件將 MatrixTransformMatrix 屬性顯示為動畫。MatrixTransform 會套用到按鈕,讓它沿著曲線路徑移動。由於 DoesRotateWithTangent 屬性設為 true,矩形會沿著路徑的正切旋轉。

<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" 
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://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);
            };



        }  
    }
}

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

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

路徑動畫型別

由於動畫會產生屬性值,因此屬性型別不同,動畫型別也不同。如果要讓使用 Double 的屬性 (例如 TranslateTransformX 屬性) 顯示動畫,請使用會產生 Double 值的動畫。如果要讓使用 Point 的屬性顯示動畫,請使用會產生 Point 值的動畫,依此類推。

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

*<Type>*AnimationUsingPath

其中 <Type> 是類別顯示為動畫之值的型別。

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

屬性型別

對應的路徑動畫類別

範例

Double

DoubleAnimation

HOW TO:沿著路徑建立物件的動畫 (Double 動畫)

Matrix

MatrixAnimationUsingPath

HOW TO:沿著路徑建立物件的動畫 (點動畫)

Point

PointAnimation

HOW TO:沿著路徑建立物件的動畫 (矩陣動畫)

MatrixAnimationUsingPath 會從其 PathGeometry 產生 Matrix 值。當與 MatrixTransform 一起使用時,MatrixAnimationUsingPath 可將物件移著路徑移動。如果將 MatrixAnimationUsingPathDoesRotateWithTangent 屬性設為 true,則它也會沿著路徑的曲線旋轉物件。

PointAnimationUsingPath 會從其 PathGeometry 的 X 和 Y 座標產生 Point 值。藉由使用 PointAnimationUsingPath 讓使用 Point 值的屬性顯示動畫,您可以將物件沿著路徑移動。PointAnimationUsingPath 無法旋轉物件。

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

路徑動畫輸出

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

PathGeometry 的核心是一組 PathFigure 物件,這些物件會如此命名,是因為每個圖形都會描述 PathGeometry 中的不同形狀。每個 PathFigure 都包含一或多個 PathSegment 物件,而每個物件都描述圖形的某一個區段。

區段有許多種。

區段類型

說明

ArcSegment

在兩點之間建立橢圓弧形。

BezierSegment

在兩點之間建立立方貝茲曲線。

LineSegment

在兩點之間建立線條。

PolyBezierSegment

建立一系列的立方貝茲曲線。

PolyLineSegment

建立一系列線條。

PolyQuadraticBezierSegment

建立一系列二次貝茲曲線。

QuadraticBezierSegment

建立一條二次貝茲曲線。

PathFigure 中的區段可以合併成單一幾何形狀,使用一個區段的終點做為下一個區段的起點。PathFigureStartPoint 屬性會指定繪製第一個區段的起點。後續的區段再從前一個區段的終點開始。例如,要定義 10,50 到 10,150 的垂直線,可以將 StartPoint 屬性設為 10,50,然後建立 LineSegment,並將其 Point 屬性設為 10,150。

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

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

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

請參閱

工作

路徑動畫範例

概念

路徑標記語法

動畫概觀

建立屬性動畫技術概觀

其他資源

路徑動畫 HOW TO 主題