Udostępnij za pośrednictwem


Omówienie animacji niestandardowych

W tym temacie opisano, jak i kiedy rozszerzyć system animacji WPF przez utworzenie niestandardowych klatek kluczowych, klas animacji lub użycie wywołania zwrotnego dla każdej klatki, aby go ominąć.

Warunki wstępne

Aby zrozumieć ten temat, należy zapoznać się z różnymi typami animacji udostępnianych przez WPF. Aby uzyskać więcej informacji, zobacz Omówienie animacji from/To/By, Key-Frame Animations Overviewi Path Animations Overview.

Ponieważ klasy animacji dziedziczą z klasy Freezable, należy zapoznać się z obiektami Freezable i sposobem dziedziczenia z Freezable. Aby uzyskać więcej informacji, zobacz omówienie obiektów zamrażalnych.

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 zawiera trzy podstawowe punkty rozszerzalności:

  • Utwórz niestandardowy obiekt ramki klucza, dziedzicząc z jednego z *<Type>*KeyFrame classes, takich jak DoubleKeyFrame. To podejście wykorzystuje większość wbudowanych funkcji silnika animacji WPF.

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

  • Użyj wywołania zwrotnego dla każdej klatki, aby generować animacje na podstawie poszczególnych klatek. To podejście całkowicie pomija system animacji i chronometrażu.

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

Kiedy chcesz... Użyj tego podejścia
Dostosowywanie interpolacji między wartościami typu, który ma odpowiadający *<typ>*AnimationUsingKeyFrames Utwórz niestandardową ramkę klucza. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej ramki klucza.
Dostosuj więcej niż tylko interpolację między wartościami typu, który ma odpowiadający *<Typ>*Animacja. Utwórz niestandardową klasę animacji, która dziedziczy z klasy *<Type>*AnimationBase, odpowiadającej typowi, który chcesz animować. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej klasy animacji.
Animowanie typu, który nie ma odpowiedniej animacji WPF Użyj ObjectAnimationUsingKeyFrames lub utwórz klasę dziedziczącą z AnimationTimeline. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej klasy animacji.
Animacja wielu obiektów z wartościami obliczanymi dla każdej klatki, opartymi na ostatnim zestawie interakcji z obiektami Użyj wywołania zwrotnego dla każdej ramki. Aby uzyskać więcej informacji, zobacz sekcję Create a Use Per-Frame Callback.

Utwórz niestandardową klatkę kluczową

Tworzenie niestandardowej klasy klatek kluczowych jest najprostszym sposobem rozszerzenia systemu animacji. Użyj tego podejścia, jeśli chcesz użyć innej metody interpolacji animacji klatek kluczowych. Zgodnie z opisem w Key-Frame Animations Overview, animacja klatek kluczowych wykorzystuje obiekty kluczowe do generowania wartości wyjściowych. Każdy obiekt ramki klucza wykonuje trzy funkcje:

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

  • Określa czas osiągnięcia tej wartości przy użyciu jej właściwości KeyTime.

  • Interpoluje między wartością poprzedniej kluczowej ramki a swoją własną wartością poprzez zaimplementowanie metody InterpolateValueCore.

instrukcje implementacji

Wyprowadź z klasy abstrakcyjnej *<typu>*KeyFrame i zaimplementuj metodę InterpolateValueCore. Metoda InterpolateValueCore zwraca bieżącą wartość ramki klucza. Przyjmuje dwa parametry: wartość poprzedniej klatki kluczowej i wartość postępu, która waha się od 0 do 1. Postęp 0 wskazuje, że klatka kluczowa dopiero się zaczyna, a wartość 1 wskazuje, że klatka kluczowa właśnie została ukończona i powinna zwrócić wartość określoną przez jej właściwość Value.

Ponieważ klasy *<Type>*KeyFrame dziedziczą z klasy Freezable, należy również zastąpić CreateInstanceCore rdzenia, 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 Przegląd obiektów z możliwością zamrażania.

Po utworzeniu niestandardowego *<Typu>*KeyFrame animation, możesz użyć jej z *<Typu>*AnimationUsingKeyFrames dla tego typu.

Tworzenie niestandardowej klasy animacji

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

Pochodne od typu <>AnimationBase

Wyprowadzanie z klasy *<Type>*AnimationBase to najprostszy sposób tworzenia nowego typu animacji. Użyj tego podejścia, jeśli chcesz utworzyć nową animację dla typu, który już posiada odpowiednią klasę AnimationBase *<Typ>*.

instrukcje implementacji

Pochodzą z klasy *<type>*Animation i zaimplementuj metodę GetCurrentValueCore. Metoda GetCurrentValueCore zwraca bieżącą wartość animacji. Przyjmuje trzy parametry: sugerowaną wartość początkową, sugerowaną wartość końcową i AnimationClock, która służy do określania postępu animacji.

Ponieważ klasy *<Type>*AnimationBase dziedziczą z klasy Freezable, należy również przesłonić podstawowe funkcje 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 Przeglądu obiektów z możliwością zamrażania.

Aby uzyskać więcej informacji, zobacz dokumentację metody GetCurrentValueCore dla klasy *<Type>*AnimationBase dla typu, który chcesz animować. Aby zapoznać się z przykładem animacji niestandardowej , zobacz przykład

alternatywne podejścia

Rozważ wyprowadzenie z jednej z klas *<Typ>*KeyFrame, jeśli po prostu chcesz zmienić sposób interpolacji wartości animacji. Utworzona kluczowa ramka może być używana z odpowiednią *<Type>*AnimationUsingKeyFrames dostarczoną przez WPF.

Wyprowadzanie z linii czasu animacji

Pochodź z klasy AnimationTimeline, gdy chcesz utworzyć animację dla typu, który nie ma jeszcze odpowiadającej animacji WPF, lub chcesz utworzyć animację, która nie jest silnie związaną z typem.

instrukcje implementacji

Wyprowadź z klasy AnimationTimeline i przedefiniuj następujące elementy członkowskie:

  • CreateInstanceCore — jeśli nowa klasa jest konkretna, należy zastąpić CreateInstanceCore, aby zwrócić nowe wystąpienie klasy.

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

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

  • TargetPropertyType — zastąpi tę właściwość, aby wskazać Type danych wyjściowych generowanych przez animację.

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; więcej informacji znajdziesz w Przegląd obiektów z możliwością zamrażania.

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

  1. Utwórz abstrakcję *<Typ>*Klasa AnimationBase, która pochodzi z AnimationTimeline. Ta klasa powinna zastąpić metodę TargetPropertyType. Powinna również wprowadzić nową metodę abstrakcyjną, GetCurrentValueCore, i przesłonić GetCurrentValue, aby zweryfikować typy domyślnej wartości początkowej i domyślnej wartości docelowej, a następnie wywołać metodę GetCurrentValueCore.

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

alternatywne podejścia

Jeśli chcesz animować typ danych, który nie ma odpowiadającej animacji From/To/By czy animacji klatek kluczowych, możesz rozważyć użycie ObjectAnimationUsingKeyFrames. Ponieważ jest on słabo wpisany, ObjectAnimationUsingKeyFrames może animować dowolny typ wartości. Wadą tego podejścia jest to, że ObjectAnimationUsingKeyFrames obsługuje tylko dyskretną interpolację.

Używanie wywołania zwrotnego Per-Frame

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

instrukcje implementacji

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

Zamiast tego zarejestruj się do zdarzenia Rendering obiektu, który zawiera obiekty, które chcesz animować. Ta metoda obsługi zdarzeń jest wywoływana raz na ramkę. Za każdym razem, gdy platforma WPF przenosi utrwalone dane renderowania z drzewa wizualnego do drzewa kompozycji, wywoływana jest metoda obsługi zdarzeń.

W programie obsługi zdarzeń wykonaj dowolne obliczenia niezbędne dla efektu animacji i ustaw właściwości obiektów, które mają być animowane przy użyciu tych wartości.

Aby uzyskać czas prezentacji bieżącej ramki, EventArgs skojarzone z tym zdarzeniem można przekonwertować do RenderingEventArgs, która zawiera właściwość RenderingTime umożliwiającą uzyskanie czasu renderowania tej ramki.

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

Zobacz też