Zwalnianie funkcji

Funkcje złagodzenia umożliwiają stosowanie niestandardowych formuł matematycznych do animacji. Na przykład możesz chcieć, aby obiekt realistycznie odbijał się lub zachowywał się tak, jakby był na wiosnę. Możesz użyć animacji Key-Frame, a nawet From/To/By, aby przybliżyć te efekty, ale zajęłoby to znaczną ilość pracy, a animacja byłaby mniej dokładna niż użycie formuły matematycznej.

Oprócz tworzenia własnej niestandardowej funkcji złagodzenia przez dziedziczenie z EasingFunctionBaseprogramu można użyć jednej z kilku funkcji ułatwiania zapewnianych przez środowisko uruchomieniowe w celu utworzenia typowych efektów.

  • BackEase: Wycofuje ruch animacji nieco przed rozpoczęciem animowania w wskazanej ścieżce.

  • BounceEase: Tworzy efekt odbijający.

  • CircleEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu funkcji cyklicznej.

  • CubicEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły f(t) = t3.

  • ElasticEase: Tworzy animację przypominającą sprężynę oscylującą tam iz powrotem, aż do odpoczynku.

  • ExponentialEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły wykładniczej.

  • PowerEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły f(t) = t p, gdzie p jest równe Power właściwości.

  • QuadraticEase: tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły f(t) = t2.

  • QuarticEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły f(t) = t4.

  • QuinticEase: Utwórz animację, która przyspiesza i/lub zwalnia przy użyciu formuły f(t) = t5.

  • SineEase: Tworzy animację, która przyspiesza i/lub zwalnia przy użyciu formuły sinusu.

Aby zastosować funkcję złagodzenia do animacji, użyj EasingFunction właściwości animacji, aby określić funkcję złagodzenia, aby zastosować do animacji. Poniższy przykład stosuje BounceEase funkcję złagodzenia do DoubleAnimation elementu w celu utworzenia efektu odbijającego.

<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>

W poprzednim przykładzie funkcja easing została zastosowana do animacji From/To/By. Można również zastosować te funkcje złagodzenia do animacji klatek kluczowych. W poniższym przykładzie pokazano, jak używać klatek kluczowych z funkcjami złagodzenia skojarzonymi z nimi w celu utworzenia animacji prostokąta, który kontraktuje w górę, spowalnia, a następnie rozwija w dół (jakby spadał), a następnie odbija się do zatrzymania.

<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>

Za pomocą EasingMode właściwości można zmienić sposób działania funkcji złagodzenia, czyli zmienić sposób interpolacji animacji. Istnieją trzy możliwe wartości, które można nadać dla EasingModeelementu :

  • EaseIn: Interpolacja jest zgodna z formułą matematyczną skojarzona z funkcją złagodzenia.

  • EaseOut: Interpolacja następuje po 100% interpolacji pomniejszonej o dane wyjściowe formuły skojarzonej z funkcją złagodzenia.

  • EaseInOut: Interpolacja używa EaseIn w pierwszej połowie animacji i EaseOut w drugiej połowie.

Poniższe wykresy pokazują różne wartości EasingMode , w których f(x) reprezentuje postęp animacji i t reprezentuje czas.

BackEase

BackEase EasingMode graphs.

BounceEase

BounceEase EasingMode graphs.

CircleEase

CircleEase EasingMode graphs.

CubicEase

CubicEase EasingMode graphs.

ElasticEase

ElasticEase with graphs of different easingmodes.

ExponentialEase

ExponentialEase graphs of different easingmodes.

PowerEase

QuarticEase with graphs of different easingmodes.

QuadraticEase

QuadraticEase with graphs of different easingmodes

QuarticEase

QuarticEase with graphs of different easingmodes.

QuinticEase

QuinticEase with graphs of different easingmodes.

SineEase

SineEase for different EasingMode values

Uwaga

Możesz użyć PowerEase polecenia , aby utworzyć to samo zachowanie co CubicEase, QuadraticEase, QuarticEasei QuinticEase za pomocą Power właściwości . Jeśli na przykład chcesz użyć PowerEase polecenia , aby zastąpić CubicEasewartość , określ Power wartość 3.

Oprócz korzystania z funkcji ułatwiania korzystania z funkcji uwzględnionych w czasie wykonywania można utworzyć własne niestandardowe funkcje złagodzenia, dziedzicząc z EasingFunctionBaseklasy . W poniższym przykładzie pokazano, jak utworzyć prostą niestandardową funkcję złagodzenia. Możesz dodać własną logikę matematyczną, aby dowiedzieć się, jak działa funkcja złagodzenia, przesłaniając metodę 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>