Przegląd Niestandardowe animacje

W tym temacie opisano sposób i czas rozszerzania systemu animacji WPF przez utworzenie niestandardowych klatek kluczowych, klas animacji lub użycie wywołania zwrotnego dla ramki w celu jego obejścia.

Wymagania wstępne

Aby zrozumieć ten temat, należy zapoznać się z różnymi typami animacji zapewnianych przez WPF. Aby uzyskać więcej informacji, zobacz Przegląd animacji od/do/przez, przegląd animacji klatek kluczowych i przegląd animacji ścieżki.

Ponieważ klasy animacji dziedziczą po klasie Freezable , należy Freezable znać obiekty i sposób dziedziczenia z klasy Freezable. Aby uzyskać więcej informacji, zobacz Freezable Objects Overview (Omówienie obiektów Freezable).

Rozszerzanie systemu animacji

Istnieje wiele sposobów rozszerzania systemu animacji WPF w zależności od poziomu wbudowanych funkcji, których chcesz użyć. Aparat animacji WPF ma trzy podstawowe punkty rozszerzalności:

  • Utwórz niestandardowy obiekt ramki klucza, dziedzicząc z jednej z klas *<Type>*KeyFrame, takich jak DoubleKeyFrame. W tym podejściu jest używana większość wbudowanych funkcji aparatu animacji WPF.

  • Utwórz własną klasę animacji, dziedzicząc z AnimationTimeline lub jednej z klas *<Type>*AnimationBase.

  • Użyj wywołania zwrotnego dla 1 ramki, aby wygenerować animacje dla 1 ramki. Takie podejście całkowicie pomija animację i system chronometrażu.

W poniższej tabeli opisano niektóre scenariusze rozszerzania systemu animacji.

Gdy chcesz... Użyj tego podejścia
Dostosowywanie interpolacji między wartościami typu, który ma odpowiadający mu *<Typ>*AnimacjaUsingKeyFrames Utwórz niestandardową ramkę klawiszy. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej ramki klawiszy .
Dostosuj nie tylko interpolację między wartościami typu, który ma odpowiadający mu *<typ>*animację. Utwórz niestandardową klasę animacji dziedziczcącą z klasy *<Type>*AnimationBase, która odpowiada typowi, który chcesz animować. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej klasy animacji .
Animowanie typu, który nie ma odpowiadającej animacji WPF Użyj klasy ObjectAnimationUsingKeyFrames lub utwórz klasę dziedziczącą z klasy AnimationTimeline. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej klasy animacji .
Animowanie wielu obiektów z wartościami, które są obliczane dla każdej ramki i są oparte na ostatnim zestawie interakcji obiektu Użyj wywołania zwrotnego na ramkę. Aby uzyskać więcej informacji, zobacz sekcję Create a Use Per-Frame Callback (Tworzenie wywołania zwrotnego Per-Frame użycia ).

Tworzenie niestandardowej ramki klawiszy

Tworzenie niestandardowej klasy klatek kluczowych to najprostszy sposób rozszerzania systemu animacji. Użyj tej metody, jeśli chcesz użyć innej metody interpolacji dla animacji klatek kluczowych. Jak opisano w przeglądzie animacji klatek kluczowych, animacja klatek kluczowych używa obiektów klatek kluczowych do generowania wartości wyjściowych. Każdy obiekt klatek kluczowych pełni trzy funkcje:

  • Określa wartość docelową przy użyciu jej Value właściwości.

  • Określa czas, o którym ta wartość powinna zostać osiągnięta przy użyciu jej KeyTime właściwości.

  • Interpoluje wartość poprzedniej ramki klucza i jej własną wartość, implementując metodę InterpolateValueCore.

Instrukcje implementacji

Pochodzą z klasy abstrakcyjnej *<Type>*KeyFrame i implementują metodę InterpolateValueCore. Metoda InterpolateValueCore zwraca bieżącą wartość ramki klucza. Przyjmuje ona dwa parametry: wartość poprzedniej ramki klucza i wartość postępu z zakresu od 0 do 1. Postęp o wartości 0 wskazuje, że ramka klucza została właśnie uruchomiona, a wartość 1 wskazuje, że ramka klucza została właśnie zakończona i powinna zwrócić wartość określoną przez jej Value właściwość.

Ponieważ klasy *<Type>*KeyFrame dziedziczą z Freezable klasy , należy również zastąpić rdzeń, CreateInstanceCore aby zwrócić nowe wystąpienie klasy. Jeśli klasa nie używa właściwości zależności do przechowywania danych lub wymaga dodatkowej inicjalizacji po utworzeniu, może być konieczne zastąpienie dodatkowych metod; Aby uzyskać więcej informacji, zobacz Freezable Objects Overview (Omówienie obiektów Freezable ).

Po utworzeniu niestandardowej animacji *<>Type*KeyFrame możesz użyć jej z elementem *<Type>*AnimationUsingKeyFrames dla tego typu.

Tworzenie niestandardowej klasy animacji

Tworzenie własnego typu animacji zapewnia większą kontrolę nad tym, jak obiekt jest animowany. Istnieją dwa zalecane sposoby tworzenia własnego typu animacji: AnimationTimeline można utworzyć na podstawie klasy lub klasy *<Type>*AnimationBase. Wyprowadzanie z klas *<Typ>*Animacja lub *<Typ>*AnimacjaUsingKeyFrames nie jest zalecane.

Wyprowadzanie z <TypeAnimationBase>

Wyprowadzanie z klasy *<Type>*AnimationBase to najprostszy sposób tworzenia nowego typu animacji. Użyj tej metody, jeśli chcesz utworzyć nową animację dla typu, który ma już odpowiadającą klasę *<Type>*AnimationBase.

Instrukcje implementacji

Wyprowadzanie z klasy *<Type>*Animation i implementowanie metody GetCurrentValueCore. Metoda GetCurrentValueCore zwraca bieżącą wartość animacji. Przyjmuje ona trzy parametry: sugerowaną wartość początkową, AnimationClocksugerowaną wartość końcową i , która umożliwia określenie postępu animacji.

Ponieważ klasy *<Type>*AnimationBase dziedziczą z Freezable klasy , należy również CreateInstanceCore zastąpić rdzeń, aby zwrócić nowe wystąpienie klasy. Jeśli klasa nie używa właściwości zależności do przechowywania danych lub wymaga dodatkowej inicjalizacji po utworzeniu, może być konieczne zastąpienie dodatkowych metod; Aby uzyskać więcej informacji, zobacz Freezable Objects Overview (Omówienie obiektów Freezable ).

Aby uzyskać więcej informacji, zobacz dokumentację metody GetCurrentValueCore dla klasy *<Type>*AnimationBase dla typu, który chcesz animować. Przykład można znaleźć w przykładzie Niestandardowe animacje

Alternatywne podejścia

Jeśli chcesz po prostu zmienić sposób interpolacji wartości animacji, rozważ wyprowadzenie z jednej z klas *<Type>*KeyFrame. Tworzyć ramkę klucza można używać z odpowiednimi elementami *<Type>*AnimationUsingKeyFrame dostarczonymi przez WPF.

Pochodzą z AnimationTimeline

Pochodzą z klasy AnimationTimeline , gdy chcesz utworzyć animację dla typu, który nie ma jeszcze pasującej animacji WPF, lub chcesz utworzyć animację, która nie jest silnie typowana.

Instrukcje implementacji

Pochodzą z klasy AnimationTimeline i przesłaniaj następujące składowe:

  • CreateInstanceCore – Jeśli nowa klasa jest konkretna, należy przesłonić CreateInstanceCore metodę , aby zwrócić nowe wystąpienie klasy.

  • GetCurrentValue — zastąp tę metodę, aby zwrócić bieżącą wartość animacji. Przyjmuje ona trzy parametry: domyślną wartość źródła, domyślną wartość docelową i .AnimationClock Użyj funkcji , AnimationClock aby uzyskać bieżący czas lub postęp animacji. Możesz wybrać, czy chcesz używać domyślnych wartości źródła i miejsca docelowego.

  • IsDestinationDefault — zastąp tę właściwość, aby wskazać, czy animacja używa domyślnej wartości docelowej określonej przez GetCurrentValue metodę .

  • TargetPropertyType — zastąp tę właściwość, aby wskazać dane Type wyjściowe, które generuje animacja.

Jeśli klasa nie używa właściwości zależności do przechowywania danych lub wymaga dodatkowej inicjalizacji po utworzeniu, może być konieczne zastąpienie dodatkowych metod; Aby uzyskać więcej informacji, zobacz Freezable Objects Overview (Omówienie obiektów Freezable ).

Zalecanym paradygmatem (używanym przez animacje WPF) jest użycie dwóch poziomów dziedziczenia:

  1. Utwórz abstrakcyjną klasę *<Type>*AnimationBase pochodzącą od klasy AnimationTimeline. Ta klasa powinna zastąpić TargetPropertyType metodę . Należy również wprowadzić nową metodę abstrakcyjną GetCurrentValueCore i przesłonić ją tak, GetCurrentValue aby sprawdzała typy domyślnej wartości źródła i domyślnych parametrów wartości docelowej, a następnie wywołuje metodę GetCurrentValueCore.

  2. Utwórz inną klasę, która dziedziczy z nowej klasy *<Type>*AnimationBase CreateInstanceCore i zastępuje metodę, wprowadzona metodę GetCurrentValueCore oraz właściwość IsDestinationDefault .

Alternatywne podejścia

Jeśli chcesz animować typ, który nie ma odpowiadającej animacji From/To/By ani animacji klatek kluczowych, rozważ użycie obiektu ObjectAnimationUsingKeyFrames. Ponieważ typ jest słabie wpisany, element może ObjectAnimationUsingKeyFrames animować wartości dowolnego typu. Wadą tego podejścia jest to, że obsługuje ObjectAnimationUsingKeyFrames tylko interpolację dyskretną.

Używanie Per-Frame zwrotnego

Użyj tej metody, jeśli musisz całkowicie pominąć system animacji WPF. Jednym ze scenariuszy dla tego podejścia są animacje fizyki, w których na każdym kroku animacji należy ponownie zrównowadzić kierunek lub położenie animowanych obiektów na podstawie ostatniego zestawu interakcji obiektu.

Instrukcje implementacji

W przeciwieństwie do innych podejść opisanych w tym przeglądzie, aby użyć wywołania zwrotnego dla 1 ramki, nie trzeba tworzyć niestandardowej animacji ani klasy klatek kluczowych.

Zamiast tego należy zarejestrować zdarzenie Rendering obiektu zawierającego obiekty, które chcesz animować. Ta metoda procedury obsługi zdarzeń jest wywoływana raz na ramkę. Za każdym razem, gdy WPF marshaluje utrwalone dane renderowania w drzewie wizualnym do drzewa kompozycji, wywoływana jest metoda procedury obsługi zdarzeń.

W programie obsługi zdarzeń wykonaj wszelkie obliczenia niezbędne do efektu animacji i ustaw właściwości obiektów, które chcesz animować przy użyciu tych wartości.

Aby uzyskać czas prezentacji bieżącej ramki, EventArgsRenderingEventArgsskojarzoną z tym zdarzeniem można rzutować jako , RenderingTime która zapewnia właściwość, której można użyć do uzyskania czasu renderowania bieżącej ramki.

Aby uzyskać więcej informacji, zobacz Rendering stronę .

Zobacz też