65.9K
CodeProject 正在变化。 阅读更多。
Home

纯 XAML 代码的 WPF 动画贝塞尔曲线

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (9投票s)

2011 年 4 月 27 日

CPOL

2分钟阅读

viewsIcon

33931

使用 XAML 代码实现动画,绘制贝塞尔曲线对象。

前言

可以使用 BezierSegment 对象创建贝塞尔曲线。请注意,贝塞尔曲线由四个点定义:一个起始点、一个终点和两个控制点。BezierSegment 类不包含曲线起始点的属性,它仅定义终点。曲线的起始点是添加 BezierSegmentPathFigure 的当前点。请注意,PathFigure 是使用由多个段组成的不间断线条绘制的形状。有几种类型的段,它们都源自 PathSegment 类。

如果我们把直线段想象成具有弹性,那么两个控制点将从两侧推动这个直线段,形成贝塞尔曲线。第一个控制点影响曲线的起始部分,而第二个控制点影响曲线的结束部分。曲线不一定通过这两个控制点,每个控制点将它所控制的线条部分向自身移动,而不是穿过自身。以下示例完全通过 XAML 实现,不使用代码后台文件。它显示了一个贝塞尔曲线,其两个控制点被动画化。第一个控制点的 X 坐标和第二个控制点的 Y 坐标在 [50, 250] 范围内变化。

请注意下方的图片。第一张图片描绘了直线,后一张图片描绘了通过 Microsoft Expression Blend IDE 的动画功能绘制的曲线。XAML 中包含的线性渐变画笔可以删除,以产生默认的白色。

1.jpg

动画之后

2.jpg

<Window x:Class="BezierProject.BezierCurve"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Bezier Curve Animation"
  Height="300" Width="300">
<Viewbox Stretch="Fill">
<Border Margin="5" BorderBrush="Black" 
  BorderThickness="1" HorizontalAlignment="Left">
<Canvas x:Name="canvas1" Width="300" Height="270">
  <Canvas.Background>
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop Color="Black" Offset="0"/>
 <GradientStop Color="#FF00FFE8" Offset="1"/>
      <GradientStop Color="#FF00201D"/>
      </LinearGradientBrush>
   </Canvas.Background>
   <Path Stroke="Black" StrokeThickness="5">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="20,20">
<BezierSegment x:Name="bezierSegment" Point1="150,50"
Point2="60,160" Point3="250,230"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
<Path x:Name="path1" Fill="Red"
Stroke="Red">
<Path.Data>
<GeometryGroup>
<LineGeometry x:Name="line1" StartPoint="20,20"
  EndPoint="150,50"/>
<EllipseGeometry x:Name="ellipse1" Center="150,50" 
  RadiusX="5" RadiusY="5" />
<LineGeometry x:Name="line2" 
  StartPoint="60,160" EndPoint="250,230"/>
<EllipseGeometry x:Name="ellipse2" 
  Center="60,160" RadiusX="5" RadiusY="5" />
</GeometryGroup>
</Path.Data>
</Path>
 
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever"
  AutoReverse="True">
<PointAnimation
  Storyboard.TargetName="bezierSegment"
  Storyboard.TargetProperty="Point1"
  From="50 20" To="250 20"
  Duration="0:0:5"/>
<PointAnimation Storyboard.TargetName="line1"
  Storyboard.TargetProperty="EndPoint"
  From="50 20" To="250 20"
  Duration="0:0:5"/>
<PointAnimation
  Storyboard.TargetName="ellipse1"
  Storyboard.TargetProperty="Center"
  From="50 20" To="250 20"
  Duration="0:0:5"/>
<PointAnimation
  Storyboard.TargetName="bezierSegment"
  Storyboard.TargetProperty="Point2"
  From="60 50" To="60 250"
  Duration="0:0:5"/>
<PointAnimation Storyboard.TargetName="line2"
  Storyboard.TargetProperty="StartPoint"
  From="60 50" To="60 250"
  Duration="0:0:5"/>
<PointAnimation
  Storyboard.TargetName="ellipse2"
  Storyboard.TargetProperty="Center"
  From="60 50" To="60 250"
  Duration="0:0:5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
</Canvas>
</Border>
</Viewbox>
</Window>

此 XAML 文件使用 BezierSegment 创建贝塞尔曲线。贝塞尔曲线的两个控制点 Point1Point2 由两个椭圆形状明确标记。同时,创建了两个线段来引导您的眼睛观察动画。第一个线段连接起始点和 Point1,而第二个线段连接终点和 Point2。动画在 Storyboard 元素中使用 PointAnimation 执行。在这里,您不仅动画化了贝塞尔曲线的控制点,还动画化了红点(椭圆)和引导线。

© . All rights reserved.