Dela via


Lättnadsfunktioner

Med hjälp av hjälpfunktioner kan du använda anpassade matematiska formler för dina animeringar. Du kanske till exempel vill att ett objekt ska studsa realistiskt eller bete sig som om det vore på en fjäder. Du kan använda Key-Frame eller till och med från/till/av-animeringar för att uppskatta dessa effekter, men det skulle krävas en betydande mängd arbete och animeringen skulle vara mindre exakt än att använda en matematisk formel.

Förutom att skapa en egen anpassad taktfunktion genom att ärva från EasingFunctionBase, kan du använda en av flera taktfunktioner som tillhandahålls av runtime-miljön för att skapa vanliga effekter.

  • BackEase: Drar tillbaka en animeringsrörelse lite grann innan den börjar animera i den angivna sökvägen.

  • BounceEase: Skapar en studsande effekt.

  • CircleEase: Skapar en animering som accelererar och/eller saktar in med hjälp av en cirkulär funktion.

  • CubicEase: Skapar en animering som accelererar och/eller saktar in med formeln f(t) = t3.

  • ElasticEase: Skapar en animering som liknar en fjäder som oscillerar fram och tillbaka tills den kommer till vila.

  • ExponentialEase: Skapar en animering som accelererar och/eller saktar in med hjälp av en exponentiell formel.

  • PowerEase: Skapar en animering som accelererar och/eller saktar in med formeln f(t) = tp där p är lika med egenskapen Power.

  • QuadraticEase: Skapar en animering som accelererar och/eller saktar in med formeln f(t) = t2.

  • QuarticEase: Skapar en animering som accelererar och/eller saktar in med formeln f(t) = t4.

  • QuinticEase: Skapa en animering som accelererar och/eller saktar in med formeln f(t) = t5.

  • SineEase: Skapar en animering som accelererar och/eller saktar in med hjälp av en sinusformel.

Om du vill använda en lättnadsfunktion för en animering använder du egenskapen EasingFunction för animeringen och anger vilken lättnadsfunktion som ska tillämpas på animeringen. I följande exempel tillämpas en BounceEase lättnadsfunktion på en DoubleAnimation för att skapa en studsande effekt.

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

I föregående exempel tillämpades lättnadsfunktionen på en From/To/By-animering. Du kan också använda dessa inbromsningsfunktioner på Key-Frame-animeringar. I följande exempel visas hur du använder nyckelramar med easingfunktioner som är associerade med dem för att skapa en animering av en rektangel som drar ihop sig uppåt, saktar ned och sedan expanderar nedåt (som om den faller) och sedan studsar tills den stannar.

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

Du kan använda egenskapen EasingMode för att ändra hur lättningsfunktionen fungerar, det vill s.v.s. ändra hur animeringen interpolerar. Det finns tre möjliga värden som du kan ange för EasingMode:

  • EaseIn: Interpolationen följer den matematiska formel som är kopplad till easing-funktionen.

  • EaseOut: Interpolationen följer 100% interpolation minus utdata från formeln som är associerad med lättnadsfunktionen.

  • EaseInOut: Interpolation använder EaseIn för den första halvan av animeringen och EaseOut för den andra halvleken.

Graferna nedan visar de olika värdena för EasingMode där f(x) representerar animeringens förlopp och t representerar tid.

BackEase

BackEase EasingMode-grafer.

BounceEase

BounceEase EasingMode-grafer.

CircleEase

CircleEase EasingMode grafer.

CubicEase

CubicEase grafer för EasingMode.

ElasticEase

ElasticEase med grafer över olika avtrappningslägen.

ExponentialEase

ExponentialEase-grafer med olika interpolationslägen.

PowerEase

QuarticEase med grafer av olika interpolationslägen.

QuadraticEase

sv-SE: QuadraticEase med grafer av olika in- och utvägningar

QuarticEase

QuarticEase med grafer av olika interpolationsmetoder.

QuinticEase

QuinticEase med grafer över olika easinglägen.

SineEase

SineEase för olika EasingMode-värden

Notis

Du kan använda PowerEase för att skapa samma beteende som CubicEase, QuadraticEase, QuarticEaseoch QuinticEase med hjälp av egenskapen Power. Om du till exempel vill använda PowerEase som ersättning för CubicEaseanger du ett Power värde på 3.

Förutom att använda de lättnadsfunktioner som ingår i körningen kan du skapa egna anpassade lättnadsfunktioner genom att ärva från EasingFunctionBase. I följande exempel visas hur du skapar en enkel anpassad lättningsfunktion. Du kan lägga till din egen matematiska logik för hur lättnadsfunktionen fungerar genom att åsidosätta metoden 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>