Fungsi Permudah

Fungsi kemudahan memungkinkan Anda menerapkan rumus matematika kustom ke animasi Anda. Misalnya, Anda mungkin ingin objek terpental secara realistis atau berulah seolah-olah berada di musim semi. Anda dapat menggunakan animasi Key-Frame atau bahkan Dari/Ke/Oleh untuk mempertanyakan efek ini tetapi akan membutuhkan sejumlah besar pekerjaan dan animasi akan kurang akurat daripada menggunakan rumus matematika.

Selain membuat fungsi pelinggihan kustom Anda sendiri dengan mewarisi dari EasingFunctionBase, Anda dapat menggunakan salah satu dari beberapa fungsi pelingan yang disediakan oleh runtime untuk membuat efek umum.

  • BackEase: Menarik kembali gerakan animasi sedikit sebelum mulai menganimasikan di jalur yang ditunjukkan.

  • BounceEase: Membuat efek memantul.

  • CircleEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan fungsi melingkar.

  • CubicEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus f(t) = t3.

  • ElasticEase: Membuat animasi yang menyerupan musim semi berosilasi bolak-balik sampai berhenti.

  • ExponentialEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus eksponensial.

  • PowerEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus f(t) = tp di mana p sama dengan Power properti.

  • QuadraticEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus f(t) = t2.

  • QuarticEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus f(t) = t4.

  • QuinticEase: Buat animasi yang mempercepat dan/atau mempercepat menggunakan rumus f(t) = t5.

  • SineEase: Membuat animasi yang mempercepat dan/atau mempercepat menggunakan rumus sinus.

Untuk menerapkan fungsi penguraian ke animasi, gunakan EasingFunction properti animasi tentukan fungsi kemudahan untuk diterapkan ke animasi. Contoh berikut menerapkan BounceEase fungsi pelingan ke DoubleAnimation untuk membuat efek memantul.

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

Dalam contoh sebelumnya, fungsi pelingan diterapkan ke animasi Dari/Ke/Menurut. Anda juga dapat menerapkan fungsi-fungsi penguraian ini ke animasi Key-Frame. Contoh berikut menunjukkan cara menggunakan bingkai kunci dengan fungsi pelinggihan yang terkait dengannya untuk membuat animasi persegi panjang yang berkontraksi ke atas, melambat, lalu meluas ke bawah (seolah-olah jatuh) dan kemudian memantul ke berhenti.

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

Anda dapat menggunakan EasingMode properti untuk mengubah perilaku fungsi pelanggaran, yaitu mengubah bagaimana animasi menginterpolasi. Ada tiga kemungkinan nilai yang dapat Anda berikan untuk EasingMode:

  • EaseIn: Interpolasi mengikuti rumus matematika yang terkait dengan fungsi pengurangan.

  • EaseOut: Interpolasi mengikuti interpolasi 100% dikurangi output rumus yang terkait dengan fungsi pengurangan.

  • EaseInOut: Interpolasi menggunakan EaseIn untuk paruh pertama animasi dan EaseOut untuk paruh kedua.

Grafik di bawah ini menunjukkan nilai yang berbeda di EasingMode mana f(x) mewakili kemajuan animasi dan t mewakili waktu.

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

Catatan

Anda dapat menggunakan PowerEase untuk membuat perilaku yang sama dengan CubicEase, , QuarticEaseQuadraticEase, dan QuinticEase dengan menggunakan Power properti . Misalnya, jika Anda ingin menggunakan PowerEase untuk mengganti CubicEase, tentukan Power nilai 3.

Selain menggunakan fungsi pelinggihan yang disertakan dalam run-time, Anda dapat membuat fungsi pelinggihan kustom Anda sendiri dengan mewarisi dari EasingFunctionBase. Contoh berikut menunjukkan cara membuat fungsi pengurangan kustom sederhana. Anda dapat menambahkan logika matematika Anda sendiri tentang bagaimana fungsi pelinggihan bereaksi dengan mengesampingkan EaseInCore metode .

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>