パス アニメーションの概要
ここでは、パス アニメーションについて説明します。パス アニメーションを使用すると、ジオメトリック パスを使用して出力値を生成できます。 パス アニメーションは、複雑なパスに沿ってオブジェクトを移動および回転するのに役立ちます。
必要条件
このトピックを理解するには、WPF のアニメーション機能に精通している必要があります。 アニメーション機能の概要については、「アニメーションの概要」を参照してください。
パス アニメーションの定義には PathGeometry オブジェクトを使用するため、PathGeometry およびさまざまな種類の PathSegment オブジェクトについても理解している必要があります。 詳細については、「ジオメトリの概要」を参照してください。
パス アニメーションとは
パス アニメーションとは、PathGeometry を入力として使用する一種の AnimationTimeline です。 From、To、または By プロパティを設定したり (From/To/By アニメーションの場合)、キー フレームを使用したり (キー フレーム アニメーションの場合) する代わりに、ジオメトリック パスを定義し、それを使用して、パス アニメーションの PathGeometry プロパティを設定します。 パス アニメーションは、進行に伴って、パスから x、y、および角度の情報を読み取り、その情報を使用して出力を生成します。
パス アニメーションは、複雑なパスに沿ってオブジェクトをアニメーションするのに非常に便利です。 パスに沿ってオブジェクトを移動する方法の 1 つに、MatrixTransform と MatrixAnimationUsingPath を使用し、複雑なパスに沿ってオブジェクトを変換する方法があります。 次の例では、この手法を説明するために、MatrixAnimationUsingPath オブジェクトを使用して MatrixTransform の Matrix プロパティをアニメーション化します。 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>
Imports System
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
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 を作成し、1 つ以上のプロパティに適用することもできます。 アニメーションを適用するさまざまな方法の詳細については、「プロパティ アニメーションの手法の概要」を参照してください。
パス アニメーションの種類
アニメーションによってプロパティ値が生成されるため、さまざまなプロパティ型に対応するさまざまな種類のアニメーションが存在します。 Double を受け取るプロパティ (TranslateTransform の X プロパティなど) をアニメーション化するには、Double 値を生成するアニメーションを使用します。 Point を受け取るプロパティをアニメーション化するには、Point 値を生成するアニメーションを使用します。他も同様です。
パス アニメーション クラスは System.Windows.Media.Animation 名前空間に属し、次の名前付け規則を使用します。
*<Type>*AnimationUsingPath
ここで、<Type> はクラスによってアニメーション化される値の型です。
WPF には、次のパス アニメーション クラスが用意されています。
プロパティの型 |
対応するパス アニメーション クラス |
例 |
---|---|---|
MatrixAnimationUsingPath は、PathGeometry から Matrix 値を生成します。 MatrixTransform と共に使用すると、MatrixAnimationUsingPath はパスに沿ってオブジェクトを移動できます。 MatrixAnimationUsingPath の DoesRotateWithTangent プロパティを true に設定すると、パスの曲線に沿ってオブジェクトの回転も行います。
PointAnimationUsingPath は、PathGeometry の x 座標と y 座標から、Point の値を生成します。 Point 値を受け取るプロパティを PointAnimationUsingPath を使用してアニメーション化することで、パスに沿ってオブジェクトを移動できます。 PointAnimationUsingPath は、オブジェクトを回転することはできません。
DoubleAnimationUsingPath は、PathGeometry から Double 値を生成します。 Source プロパティを設定することで、DoubleAnimationUsingPath が出力としてパスの x 座標、y 座標、または角度を使用するかどうかを指定できます。 DoubleAnimationUsingPath を使用すると、オブジェクトを回転したり、x 軸または y 軸に沿ってオブジェクトを移動したりできます。
パス アニメーションの入力
各パス アニメーション クラスでは、入力を指定するための PathGeometry プロパティが提供されています。 パス アニメーションは、PathGeometry を使用して出力値を生成します。 PathGeometry クラスを使用すると、円弧、曲線、および線で構成される複数の複雑な図形を記述できます。
PathGeometry の中核は PathFigure オブジェクトのコレクションです。各図形が PathGeometry の個々の図形を表現するため、そのような名前が付いています。 各 PathFigure は 1 つ以上の PathSegment オブジェクトで構成されており、これらの各オブジェクトは図形のセグメントを記述します。
多くの種類のセグメントがあります。
セグメントの種類 |
説明 |
---|---|
2 つの点の間の楕円の円弧を作成します。 |
|
2 つの点の間の 3 次ベジエ曲線を作成します。 |
|
2 つの点の間の直線を作成します。 |
|
一連の 3 次ベジエ曲線を作成します。 |
|
一連の直線を作成します。 |
|
一連の 2 次ベジエ曲線を作成します。 |
|
2 次ベジエ曲線を作成します。 |
PathFigure のセグメントは 1 つの幾何学図形に結合され、あるセグメントの終点が次のセグメントの始点になります。 PathFigure の StartPoint プロパティは、最初のセグメントが描画される始点を指定します。 後続の各セグメントは、前のセグメントの終点から開始します。 たとえば、10,50 から 10,150 までの縦線を定義するには、StartPoint プロパティを 10,50 に設定し、Point プロパティを 10,150 に設定した LineSegment を作成します。
PathGeometry オブジェクトの詳細については、「ジオメトリの概要」を参照してください。
XAML では、特殊な省略構文を使用して、PathGeometry の Figures プロパティを設定することもできます。 詳細については、「パス マークアップ構文」の概要を参照してください。
XAML の例で使用されているパス構文の詳細については、「パス マークアップ構文」の概要を参照してください。