Sdílet prostřednictvím


Přehled vlastních animací

Toto téma popisuje, jak a kdy rozšířit animační systém WPF vytvořením vlastních klíčových snímků, tříd animací nebo pomocí zpětného volání pro jednotlivé snímky a obejít ho.

Požadavky

Abyste pochopili toto téma, měli byste být obeznámeni s různými typy animací poskytovaných WPF. Další informace najdete v Přehled animací From/To/By, Přehled animací Key-Framea Přehled animací cesty .

Vzhledem k tomu, že třídy animace dědí z Freezable třídy, měli byste být obeznámeni s Freezable objekty a jak dědit z Freezable. Další informace naleznete v Přehledu zmrazitelných objektů.

Rozšíření animačního systému

Existuje několik způsobů, jak rozšířit animační systém WPF v závislosti na úrovni předdefinovaných funkcí, které chcete použít. V animačním modulu WPF existují tři primární body rozšiřitelnosti:

  • Vytvořte objekt vlastního rámce klíče děděním z jednoho z *<Typ>*Třídy keyFrame, například DoubleKeyFrame. Tento přístup používá většinu předdefinovaných funkcí animačního modulu WPF.

  • Vytvořte vlastní animační třídu děděním z AnimationTimeline nebo jedné z *<Type>*AnimationBase třídy.

  • Použijte zpětné volání na jednotlivé snímky k vytváření animací na jejich základě. Tento přístup zcela obchází animační a časovací systém.

Následující tabulka popisuje některé scénáře rozšíření animačního systému.

Když chcete... Použití tohoto přístupu
Přizpůsobit interpolaci mezi hodnotami typu, pro který existuje odpovídající *<Typ>*AnimationUsingKeyFrames Vytvořte vlastní rámec klíče. Další informace najdete v části Vytvoření vlastního rámce klíče.
Přizpůsobte více než jen interpolaci mezi hodnotami typu, které mají odpovídající *<Typ>*Animace. Vytvořte vlastní animační třídu, která dědí z *<Typ>*AnimationBase třídy, která odpovídá typu, který chcete animovat. Další informace najdete v části Vytvoření vlastní třídy animace.
Animace typu, který nemá žádnou odpovídající animaci WPF Použijte ObjectAnimationUsingKeyFrames nebo vytvořte třídu, která dědí z AnimationTimeline. Další informace najdete v části Vytvoření vlastní třídy animace.
Animace více objektů s hodnotami vypočítanými jednotlivými snímky a jsou založeny na poslední sadě interakcí objektů Použijte zpětné volání po jednotlivých snímcích. Další informace najdete v části Vytvoření zpětného volání Per-Frame.

Vytvoření vlastního rámce klíče

Vytvoření vlastní třídy klíčových snímků je nejjednodušší způsob, jak rozšířit animační systém. Tento přístup použijte, pokud chcete použít jinou metodu interpolace pro animaci s klíčovým snímkem. Jak je popsáno v přehledu animací Key-Frame, animace s klíčovými snímky používá objekty klíčových snímků k vygenerování jejich výstupních hodnot. Každý objekt rámce klíče provádí tři funkce:

  • Určuje cílovou hodnotu pomocí vlastnosti Value.

  • Určuje čas, kdy má být tato hodnota dosažena pomocí její vlastnosti KeyTime.

  • Interpoluje mezi hodnotou předchozího rámce klíče a vlastní hodnotou implementací metody InterpolateValueCore.

pokyny k implementaci

Odvoďte z abstraktní třídy *<Type>*KeyFrame a implementujte metodu InterpolateValueCore. Metoda InterpolateValueCore vrátí aktuální hodnotu rámce klíče. Má dva parametry: hodnotu předchozího klíčového snímku a hodnotu průběhu, která se pohybuje od 0 do 1. Průběh 0 označuje, že se právě spustil klíčový snímek, a hodnota 1 označuje, že se klíčový snímek právě dokončil a měl by vrátit hodnotu určenou jeho vlastností Value.

Protože třídy *<Type>*KeyFrame dědí od třídy Freezable, musíte také přepsat jádro CreateInstanceCore, aby se vrátila nová instance vaší třídy. Pokud třída nepoužívá vlastnosti závislostí k uložení svých dat nebo vyžaduje další inicializaci po vytvoření, možná budete muset přepsat další metody; další informace naleznete v části Přehled zmrazitelných objektů.

Jakmile vytvoříte vlastní *<Typ>*animaci klíčového snímku, můžete ji použít s *<Typ>*AnimationUsingKeyFrames pro tento typ animace.

Vytvoření vlastní třídy animace

Vytvoření vlastního typu animace vám poskytuje větší kontrolu nad tím, jak je objekt animován. Existují dva doporučené způsoby vytvoření vlastního typu animace: můžete odvodit z třídy AnimationTimeline nebo z třídy *<Typ>* AnimationBase. Odvození od tříd *<Typ>*Animation nebo *<Typ>*AnimationUsingKeyFrames se nedoporučuje.

Odvození od typu <>AnimationBase

Odvození od třídy *<Typ>* AnimationBase je nejjednodušší způsob, jak vytvořit nový typ animace. Tento přístup použijte, pokud chcete vytvořit novou animaci pro typ, který již má odpovídající *<Typ>*AnimationBase třída.

pokyny k implementaci

Odvození z *<Typ>*Animation třída a implementovat GetCurrentValueCore metoda. Metoda GetCurrentValueCore vrátí aktuální hodnotu animace. Má tři parametry: navrženou počáteční hodnotu, navrženou koncovou hodnotu a AnimationClock, kterou použijete k určení průběhu animace.

Protože *<Typ>*AnimationBase třídy dědí z třídy Freezable, musíte také přepsat jádro CreateInstanceCore pro vrácení nové instance vaší třídy. Pokud třída nepoužívá přenositelné vlastnosti k uložení svých dat nebo vyžaduje další inicializaci po vytvoření, možná budete muset přepsat další metody; Podrobnosti naleznete v přehledové dokumentaci o zmrazitelných objektech .

Další informace naleznete v dokumentaci metody GetCurrentValueCore třídy AnimationBase pro typ *<Typ>*, který chcete animovat. Příklad najdete v ukázce vlastní animace

alternativní přístupy

Pokud chcete jednoduše změnit způsob, jakým jsou interpolovány hodnoty animace, zvažte odvození z některé třídy typu *<Type>*KeyFrame. Klíčový snímek, který vytvoříte, může být použit s odpovídajícím *<Type>*AnimationUsingKeyFrames poskytovanými WPF.

Odvozeno z AnimationTimeline

Odvozujte z třídy AnimationTimeline, když chcete vytvořit animaci pro typ, který ještě nemá odpovídající animaci WPF, nebo když chcete vytvořit animaci, která není silně typována.

pokyny k implementaci

Odvozujte z třídy AnimationTimeline a přepište následující členy:

  • CreateInstanceCore – Pokud je vaše nová třída konkrétní, musíte přepsat CreateInstanceCore, aby se vrátila nová instance třídy.

  • GetCurrentValue – Přepište tuto metodu tak, aby vrátila aktuální hodnotu animace. Přebírá tři parametry: výchozí počáteční hodnotu, výchozí cílovou hodnotu a AnimationClock. K získání aktuálního času nebo průběhu animace použijte AnimationClock. Můžete zvolit, jestli se mají použít výchozí počáteční a cílové hodnoty.

  • IsDestinationDefault – Přepište tuto vlastnost, která určuje, zda animace používá výchozí cílovou hodnotu určenou metodou GetCurrentValue.

  • TargetPropertyType – Přepište tuto vlastnost, která označuje, Type výstupu animace vytvoří.

Pokud třída nepoužívá vlastnosti závislostí k uložení svých dat nebo vyžaduje další inicializaci po vytvoření, možná budete muset přepsat další metody; další informace najdete v přehledu o zmrazitelných objektech .

Doporučené paradigma (používané animacemi WPF) je použít dvě úrovně dědičnosti:

  1. Vytvořte abstraktní *<Typ>třídu AnimationBase, která je odvozena z AnimationTimeline. Tato třída by měla přepsat metodu TargetPropertyType. Měl by také zavést novou abstraktní metodu GetCurrentValueCore a přepsat GetCurrentValue tak, aby ověřil typy parametrů výchozí hodnoty původu a výchozí hodnoty cíle, a poté zavolal GetCurrentValueCore.

  2. Vytvořte další třídu, která bude dědit z vaší nové třídy *AnimationBase* typu *<Typ>* a přepíše metodu CreateInstanceCore, metodu GetCurrentValueCore, kterou jste zavedli, a vlastnost IsDestinationDefault.

alternativní přístupy

Pokud chcete animovat typ, který nemá žádnou odpovídající animaci typu From/To/By nebo klíčový snímek, zvažte použití ObjectAnimationUsingKeyFrames. Protože je slabě napsaný, ObjectAnimationUsingKeyFrames může animovat libovolný typ hodnoty. Nevýhodou tohoto přístupu je, že ObjectAnimationUsingKeyFrames podporuje pouze diskrétní interpolaci.

Použijte Per-Frame zpětné volání

Tento přístup použijte, když potřebujete zcela obejít animační systém WPF. Jedním ze scénářů pro tento přístup je fyzika animace, kdy v každém kroku animace musí být nový směr nebo pozice animovaných objektů přepočítané na základě poslední sady interakcí objektů.

pokyny k implementaci

Na rozdíl od ostatních přístupů popsaných v tomto přehledu nemusíte pro použití zpětného volání pro jednotlivé snímky vytvářet vlastní animaci, animační třídu nebo třídu klíčového snímku.

Místo toho zaregistrujete událost Rendering objektu, který obsahuje objekty, které chcete animovat. Tato metoda obslužné rutiny události se volá jednou za rámec. Pokaždé, když WPF přenáší trvalá renderovaná data ve vizuálním stromu do stromu složení, volá se obslužná metoda události.

V obslužné rutině události proveďte jakékoli výpočty potřebné pro animační efekt a nastavte vlastnosti objektů, které chcete animovat s těmito hodnotami.

Chcete-li získat čas prezentace aktuálního rámce, lze EventArgs přidružené k této události přetypovat jako RenderingEventArgs, která poskytuje vlastnost RenderingTime, již můžete použít k získání doby vykreslování aktuálního rámce.

Další informace najdete na stránce Rendering.

Viz také