← 返回所有博客文章

在 ComponentOne 2012V3 中我们针对 C1Chart 做了很多增强,使用户开发图表类应用更加简单。动画效果是我们比较注重的一方面。我们新增了动画 API,使动画设置更加简单。

我们在设计 XAML 控件时,我们尽可能的使其具有灵活的扩展性。这对我们来说是一个很大的挑战,但对用户来说是很有益处的。因此,我们不希望只是给你一个枚举的属性,如“动画”与十几个可供选择的方案。这将局限你的主观能动性。所以,我们提供了扩展性较强的 PlotElementAnimation 类,它有两个属性:Storyboard 和SymbolStyle。你可以创建任何喜欢的动画风格。

下面,让我们通过实例来讲解如何实现自定义动画:

创建 Fade-in 动画效果:

这里我们通过在加载图片时改变 Chart 的透明度来实现淡入效果:

<c1:C1Chart x:Name="c1Chart1" Palette="Office">
    <c1:C1Chart.Data>
        <c1:ChartData>
            <c1:DataSeries Label="s1" Values="1 2 3 4 5" />
            <c1:ChartData.LoadAnimation>
                <c1:PlotElementAnimation Storyboard="{StaticResource sbOpacity}"
                                         SymbolStyle="{StaticResource styleOpacity}"/>
            </c1:ChartData.LoadAnimation>
        </c1:ChartData>
    </c1:C1Chart.Data>
</c1:C1Chart>
我们将创建 PlotElementAnimation 来定制动画效果。 现在,让我们来看看如何创建这些资源。
<Style TargetType="c1:PlotElement" x:Key="styleOpacity">
    <Setter Property="Opacity" Value="0" />
</Style>
<Storyboard x:Key="sbOpacity">
    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                     Duration="00:00:01"
                     From="0" To="1"
                     c1:PlotElementAnimation.IndexDelay="0.5"/>
</Storyboard>

相信大家都很熟悉 XAML 平台下的典型资源 Style 和 Storyboard。我们可以通过自定义 StoryBoard 实现 XAML 平台下的任意动画效果。把该动画样式设置给 c1:PlotElement 类型。这是我们创建动画效果的常用方法。最关键的步骤为链接 Storyboard 的 TargetProperty 到我们演示中。接下来,我们将查看如何创建更多的动画样式。

创建缩放样式:

缩放样式给元素一种增长或者缩小的效果。在设置缩放效果的同时,我们还可以添加许多其他特性,例如 EasingFunction 和 RenderTransformOrigin 样式。

<Style TargetType="c1:PlotElement" x:Key="styleScale">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <ScaleTransform ScaleX="0" ScaleY="0" />
        </Setter.Value>
    </Setter>
    <Setter Property="RenderTransformOrigin" Value="0.5, 0.5" />
</Style>
<Storyboard x:Key="sbScale">
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).ScaleX" Duration="00:00:01" From="0" To="1" c1:PlotElementAnimation.IndexDelay="0.5">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).ScaleY" Duration="00:00:00" From="0" To="1">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
</Storyboard>

注意在这里我们设置了 ScaleY 的 duration 属性为 00:00:00,我是可以移除这句代码的,考虑到一些朋友需要更改 ScaleY 的持续时间。所以,我没有删除。

应用 Style 和 Storyboard 到 C1Chart 控件后,效果如下:

RenderTransformOrigin 的 property setter 用于定制动画开始的位置,值 (0.5, 0.5) 代表动画将从中心位置开始。以下为一些位置设置列表,可以尝试更改体验效果:

  • Center = (0.5, 0.5)
  • Bottom = (0.5, 2)
  • Top = (0.5, -2)
  • Left = (-2, 0.5)
  • Right = (2, 0.5)
  • Top Left = (2, -2)
  • Top Right = (-2, -2)
  • Bottom Left = (2, 2)
  • Bottom Right = (-2, 2)

Easing 方法允许我们将自定义数学公式应用到动画中。这是 Storyboard 内置的 API ,因此,很容易更改。每个方法都有附加的属性设置,例如,Springiness, Bounciness, Easing Mode 和 Amplitude。

  • BackEase
  • BounceEase
  • CircleEase
  • CubicEase
  • ElasticEase
  • ExponentialEase
  • PowerEase
  • QuadraticEase
  • QuarticEase
  • SineEase

创建旋转效果:

旋转效果和缩放效果类似,设置方法也基本相同,这里就不多说了-代码如下:

<Style TargetType="c1:PlotElement" x:Key="styleRotate">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <RotateTransform Angle="180" />
        </Setter.Value>
    </Setter>
    <Setter Property="RenderTransformOrigin" Value="0.5, 0.5" />
</Style>
<Storyboard x:Key="sbRotate">
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).Angle" Duration="00:00:01" To="1" c1:PlotElementAnimation.IndexDelay="0.5">
        <DoubleAnimation.EasingFunction>
            <BackEase EasingMode="EaseIn"  Amplitude="5" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
</Storyboard>

Index Delay

如果你仔细的观察了代码和动画效果,你会发现每个元素的加载时间和 IndexDelay 相关。IndexDelay 属性用于设置每个元素加载的间隔时间。

<Style TargetType="c1:PlotElement" x:Key="styleScale">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <ScaleTransform ScaleX="0" ScaleY="0" />
        </Setter.Value>
    </Setter>
    <Setter Property="RenderTransformOrigin" Value="0.5, 0.5" />
</Style>
<Storyboard x:Key="sbScale">
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).ScaleX" Duration="00:00:01" From="0" To="1"
                     c1:PlotElementAnimation.IndexDelay="0.5">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).ScaleY" Duration="00:00:00" From="0" To="1">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
</Storyboard>
 

使用 TransformGroup 创建 Composite 动画效果

你可以合并之前提到的任意动画效果。可以通过 TransformGroup 实现。仅当你合并 缩放 和 旋转效果是,需要设置 TransformGroup。下面这个例子合并了 透明、缩放和旋转等动画效果:

<Style TargetType="c1:PlotElement" x:Key="styleComposite">
    <Setter Property="RenderTransform">
        <Setter.Value>
            <TransformGroup>
                <ScaleTransform ScaleX="0" ScaleY="0" />
                <RotateTransform Angle="180" />
            </TransformGroup>
        </Setter.Value>
    </Setter>
    <Setter Property="RenderTransformOrigin" Value="0.5, 0.5" />
    <Setter Property="Opacity" Value="0" />
</Style>
<Storyboard x:Key="sbComposite">
    <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="00:00:01" From="0" To="1"
                     c1:PlotElementAnimation.IndexDelay="1"/>
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(TransformGroup.Children)[0].ScaleX" Duration="00:00:01" From="0" To="1"
                     c1:PlotElementAnimation.IndexDelay="1">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(TransformGroup.Children)[0].ScaleY" Duration="00:00:01" From="0" To="1">
        <DoubleAnimation.EasingFunction>
            <CubicEase EasingMode="EaseInOut" />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
    <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(TransformGroup.Children)[1].Angle" Duration="00:00:01" To="1"
                     c1:PlotElementAnimation.IndexDelay="1">
        <DoubleAnimation.EasingFunction>
            <BackEase />
        </DoubleAnimation.EasingFunction>
    </DoubleAnimation>
</Storyboard>

 

正如你所见到的,在 WPF 和 Silverlight 下设置动画效果是非常简单的。同样,你可以应用以上动画效果到 Phone 和 WinRT平台。

Demo下载:download a sample