Przegląd Niestandardowe animacje

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 ramki w celu obejścia go.

Wymagania 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 od/do/według, animacje klatek kluczowych i animacje ścieżek — omówienie.

Ponieważ klasy animacji dziedziczą z Freezable klasy, należy zapoznać się z obiektami Freezable i sposobem dziedziczenia z Freezableklasy . 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 jednej z klas *<Type>*KeyFrame, takich jak DoubleKeyFrame. To podejście wykorzystuje większość wbudowanych funkcji aparatu animacji WPF.

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

  • Użyj wywołania zwrotnego dla ramki, aby wygenerować animacje na podstawie ramki. 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 element *<Type>*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 odpowiedni *<Typ>*Animacja. Utwórz niestandardową klasę animacji dziedziczą z klasy *<Type>*AnimationBase, która odpowiada typowi, który ma być animowany. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie niestandardowej klasy animacji.
Animowanie typu, który nie ma odpowiedniej animacji WPF ObjectAnimationUsingKeyFrames Użyj klasy lub utwórz klasę dziedziczą z AnimationTimelineklasy . 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 z obiektami Użyj wywołania zwrotnego dla ramki. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie wywołania zwrotnego dla ramki.

Tworzenie niestandardowej ramki klucza

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 sekcji Przegląd animacji klatek kluczowych animacja klatek kluczowych używa obiektów klatek kluczowych do generowania wartości wyjściowych. Każdy obiekt ramki klucza wykonuje trzy funkcje:

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

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

  • Interpoluje między wartością poprzedniej ramki klucza a własną wartością przez zaimplementowanie metody InterpolateValueCore.

Instrukcje dotyczące implementacji

Pochodzą z klasy abstrakcyjnej *<Type>*KeyFrame i zaimplementuj metodę InterpolateValueCore. Metoda InterpolateValueCore zwraca bieżącą wartość ramki klucza. Przyjmuje dwa parametry: wartość poprzedniej ramki klucza i wartość postępu, która waha się od 0 do 1. Postęp 0 wskazuje, że ramka klucza właśnie została uruchomiona, a wartość 1 wskazuje, że ramka klucza właśnie została ukoń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ć CreateInstanceCore 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 Omówienie obiektów zamrażalnych.

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 sposobem, w jaki obiekt jest animowany. Istnieją dwa zalecane sposoby tworzenia własnego typu animacji: możesz pochodzić z AnimationTimeline klasy lub klasy *<Type>*AnimationBase. Wyprowadzanie z klasy *<Type>*Animation lub *<Type>*AnimationUsingKeyFrames nie jest zalecane.

Pochodzi z <klasy AnimationBase typu>

Wyprowadzanie z klasy *<Type>*AnimationBase jest najprostszym sposobem utworzenia nowego typu animacji. Użyj tej metody, jeśli chcesz utworzyć nową animację dla typu, który ma już odpowiednią klasę *<Type>*AnimationBase.

Instrukcje dotyczące 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 Freezable klasy, należy również zastąpić CreateInstanceCore 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 Omówienie obiektów zamrażalnych.

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 przykładu animacji niestandardowej , zobacz przykład

Alternatywne podejścia

Jeśli po prostu chcesz zmienić sposób interpolacji wartości animacji, biorąc pod uwagę wyprowadzanie z jednej z klas *<Type>*KeyFrame. Utworzona ramka klucza może być używana z odpowiednimi elementami *<Type>*AnimationUsingKeyFrames dostarczonymi przez WPF.

Wyprowadzanie z linii czasu animacji

AnimationTimeline Utwórz animację dla typu, który nie ma jeszcze pasującej animacji WPF lub chcesz utworzyć animację, która nie jest silnie typizowana.

Instrukcje dotyczące implementacji

Pochodzą z AnimationTimeline klasy i przesłoń następujące elementy członkowskie:

  • CreateInstanceCore — Jeśli nowa klasa jest konkretna, należy przesłonić 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ą AnimationClocki . Użyj elementu , 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 dane wyjściowe generowane 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; Aby uzyskać więcej informacji, zobacz Omówienie obiektów zamrażalnych.

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

  1. Utwórz abstrakcyjną klasę *<Type>*AnimationBase, która pochodzi z klasy AnimationTimeline. Ta klasa powinna zastąpić metodę TargetPropertyType . Powinna również wprowadzić nową metodę abstrakcyjną, GetCurrentValueCore i zastąpić GetCurrentValue tak, aby weryfikowała typy domyślnych 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 i zastępuje CreateInstanceCore metodę GetCurrentValueCore, która została wprowadzona, i IsDestinationDefault właściwość .

Alternatywne podejścia

Jeśli chcesz animować typu, który nie ma odpowiadającej animacji From/To/By ani animacji klatek kluczowych, rozważ użycie elementu ObjectAnimationUsingKeyFrames. Ze względu na to, że jest on słabo wpisany, ObjectAnimationUsingKeyFrames obiekt 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 dla ramki

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 dotyczące implementacji

W przeciwieństwie do innych metod opisanych w tym omówieniu, aby użyć wywołania zwrotnego dla ramki, nie trzeba tworzyć niestandardowej animacji ani klasy klatek kluczowych.

Zamiast tego należy zarejestrować Rendering zdarzenie obiektu zawierającego obiekty, które mają być animowane. Ta metoda obsługi zdarzeń jest wywoływana raz na ramkę. Za każdym razem, gdy platforma WPF marshaluje utrwalone dane renderowania w drzewie wizualnym w drzewie 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 rzutować jako RenderingEventArgs, która udostępnia RenderingTime 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ż