Compartilhar via


Funções de easing

As funções de easing permitem que você aplique fórmulas matemáticas personalizadas às suas animações. Por exemplo, talvez você queira que um objeto salte ou se comporte de forma realista como se estivesse em uma mola. Você pode usar o Quadro Chave ou até mesmo as animações De/Para/Por para aproximar esses efeitos, mas isso exigiria uma quantidade significativa de trabalho e a animação seria menos precisa do que usando uma fórmula matemática.

Além de criar sua própria função de easing personalizada herdando de EasingFunctionBase, você pode usar uma das várias funções de easing fornecidas pelo runtime para criar efeitos comuns.

  • BackEase: retrai o movimento de uma animação ligeiramente antes de começar a animar no caminho indicado.

  • BounceEase: cria um efeito de rebote.

  • CircleEase: cria uma animação que acelera e/ou desacelera usando uma função circular.

  • CubicEase: cria uma animação que acelera e/ou desacelera usando a fórmula f(t) = t3.

  • ElasticEase: cria uma animação que se assemelha a uma mola oscilando de um lado para o outro até parar.

  • ExponentialEase: cria uma animação que acelera e/ou desacelera usando uma fórmula exponencial.

  • PowerEase: cria uma animação que acelera e/ou desacelera usando a fórmula f(t) = tp em que p é igual à propriedade Power.

  • QuadraticEase: cria uma animação que acelera e/ou desacelera usando a fórmula f(t) = t2.

  • QuarticEase: cria uma animação que acelera e/ou desacelera usando a fórmula f(t) = t4.

  • QuinticEase: criar uma animação que acelera e/ou desacelera usando a fórmula f(t) = t5.

  • SineEase: cria uma animação que acelera e/ou desacelera usando uma fórmula de seno.

Para aplicar uma função de easing a uma animação, use a propriedade EasingFunction da animação para especificar a função de easing que deve ser aplicada. O exemplo a seguir aplica uma função de flexibilização BounceEase a um DoubleAnimation para criar um efeito de rebote.

<Rectangle Name="myRectangle" Width="200" Height="30" Fill="Blue">
    <Rectangle.Triggers>
        <EventTrigger RoutedEvent="Rectangle.MouseDown">
            <BeginStoryboard>
                <Storyboard>
                    <Storyboard x:Name="myStoryboard">
                        <DoubleAnimation From="30" To="200" Duration="00:00:3" 
                         Storyboard.TargetName="myRectangle" 
                         Storyboard.TargetProperty="Height">
                            <DoubleAnimation.EasingFunction>
                                <BounceEase Bounces="2" EasingMode="EaseOut" 
                                 Bounciness="2" />
                            </DoubleAnimation.EasingFunction>
                        </DoubleAnimation>
                    </Storyboard>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Rectangle.Triggers>
</Rectangle>

No exemplo anterior, a função de easing foi aplicada a uma animação De/Para/Por. Você também pode aplicar essas funções de easing a animações de Quadro-Chave. O exemplo a seguir mostra como usar quadros-chave com funções de easing associadas a eles para criar uma animação de um retângulo que se contrai para cima, desacelera, depois se expande para baixo (como se estivesse caindo) e, em seguida, salta para uma parada.

<Rectangle Name="myRectangle" Width="200" Height="200" Fill="Blue">
    <Rectangle.Triggers>
        <EventTrigger RoutedEvent="Rectangle.MouseDown">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimationUsingKeyFrames
                     Storyboard.TargetProperty="Height"
                     Storyboard.TargetName="myRectangle">

                        <!-- This keyframe animates the ellipse up to the crest 
                             where it slows down and stops. -->
                        <EasingDoubleKeyFrame Value="30" KeyTime="00:00:02">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <CubicEase EasingMode="EaseOut"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>

                        <!-- This keyframe animates the ellipse back down and makes
                             it bounce. -->
                        <EasingDoubleKeyFrame Value="200" KeyTime="00:00:06">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <BounceEase Bounces="5" EasingMode="EaseOut"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>

                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Rectangle.Triggers>

</Rectangle>

Você pode usar a propriedade EasingMode para alterar como a função easing se comporta, ou seja, alterar a forma como a animação é interpolada. Há três valores possíveis que você pode dar para EasingMode:

  • EaseIn: A interpolação segue a fórmula matemática associada à função de suavização.

  • EaseOut: a interpolação segue 100% de interpolação menos a saída da fórmula associada à função de easing.

  • EaseInOut: A interpolação usa EaseIn para a primeira metade da animação e EaseOut para a segunda metade.

Os grafos abaixo demonstram os diferentes valores de EasingMode em que f(x) representa o progresso da animação e t representa o tempo.

BackEase

Grafos de EasingMode de BackEase.

BounceEase

Grafos EasingMode do BounceEase.

CircleEase

Grafos de EasingMode de CircleEase.

CubicEase

Grafos EasingMode do CubicEase.

ElasticEase

ElasticEase com grafos de easingmodes diferentes.

ExponentialEase

Grafos ExponentialEase de diferentes easingmodes.

PowerEase

QuarticEase com gráficos de diferentes modos de suavização.

QuadraticEase

QuadraticEase com grafos de easingmodes diferentes

QuarticEase

QuarticEase com grafos de diferentes easingmodes.

QuinticEase

QuinticEase com gráficos de diferentes modos de suavização.

SineEase

SineEase para valores de EasingMode diferentes

Nota

Você pode usar PowerEase para criar o mesmo comportamento que CubicEase, QuadraticEase, QuarticEasee QuinticEase usando a propriedade Power. Por exemplo, se você quiser usar PowerEase para substituir CubicEase, especifique um valor de Power de 3.

Além de usar as funções de easing incluídas no tempo de execução, você pode criar suas funções de easing personalizadas herdando de EasingFunctionBase. O exemplo a seguir demonstra como criar uma função de easing personalizada simples. Você pode adicionar sua própria lógica matemática para o modo como a função easing (função de suavização) se comporta substituindo o método EaseInCore.

namespace CustomEasingFunction
{
    public class CustomSeventhPowerEasingFunction : EasingFunctionBase
    {
        public CustomSeventhPowerEasingFunction()
            : base()
        {
        }

        // Specify your own logic for the easing function by overriding
        // the EaseInCore method. Note that this logic applies to the "EaseIn"
        // mode of interpolation.
        protected override double EaseInCore(double normalizedTime)
        {
            // applies the formula of time to the seventh power.
            return Math.Pow(normalizedTime, 7);
        }

        // Typical implementation of CreateInstanceCore
        protected override Freezable CreateInstanceCore()
        {

            return new CustomSeventhPowerEasingFunction();
        }
    }
}
Namespace CustomEasingFunction
    Public Class CustomSeventhPowerEasingFunction
        Inherits EasingFunctionBase
        Public Sub New()
            MyBase.New()
        End Sub

        ' Specify your own logic for the easing function by overriding
        ' the EaseInCore method. Note that this logic applies to the "EaseIn"
        ' mode of interpolation. 
        Protected Overrides Function EaseInCore(ByVal normalizedTime As Double) As Double
            ' applies the formula of time to the seventh power.
            Return Math.Pow(normalizedTime, 7)
        End Function

        ' Typical implementation of CreateInstanceCore
        Protected Overrides Function CreateInstanceCore() As Freezable

            Return New CustomSeventhPowerEasingFunction()
        End Function

    End Class
End Namespace
<Window x:Class="CustomEasingFunction.Window1"
        xmlns:CustomEase="clr-namespace:CustomEasingFunction"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="500" Width="300">
    <StackPanel>
        <TextBlock Margin="10" TextWrapping="Wrap">Click on the rectangle to start the animation</TextBlock>
        <StackPanel x:Name="LayoutRoot" Background="White">

            <Rectangle Name="myRectangle" Width="200" Height="30" Fill="Blue">
                <Rectangle.Triggers>
                    <EventTrigger RoutedEvent="Rectangle.MouseDown">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation From="30" To="300" Duration="00:00:3" 
                                 Storyboard.TargetName="myRectangle" 
                                 Storyboard.TargetProperty="Height">
                                    <DoubleAnimation.EasingFunction>

                                        <!-- You get the EasingMode property for free on your custom
                                             easing function.-->
                                        <CustomEase:CustomSeventhPowerEasingFunction EasingMode="EaseIn"/>
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Rectangle.Triggers>

            </Rectangle>

        </StackPanel>
    </StackPanel>

</Window>