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.
Předpoklady
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řehledu animací From/To/By, přehled animací klíčových snímků a přehled animací cest.
Protož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 zamrznutelný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ření objektu vlastního rámce klíče děděním z jedné z *<Type>*KeyFrame třídy, 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 zděděním z AnimationTimeline třídy *<Type>*AnimationBase.
Zpětné volání pro jednotlivé snímky použijte k vygenerování animací pro jednotlivé snímky. 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ůsobení interpolace mezi hodnotami typu, které mají odpovídající *<Type>*AnimationUsingKeyFrames | Vytvořte vlastní rámec klíče. Další informace najdete v části Vytvoření rámce vlastního klíče. |
Přizpůsobte si 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 třídy *<Type>*AnimationBase odpovídající 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 | ObjectAnimationUsingKeyFrames Použijte 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í podle rámce. Další informace najdete v části Vytvoření zpětného volání pro jednotlivé rámce. |
Vytvoření vlastního rámce klíče
Vytvoření vlastní třídy snímků klíčů 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í s klíčovými snímky, animace s klíčovým snímkem používá objekty klíčových snímků k vygenerování výstupních hodnot. Každý objekt rámce klíče provádí tři funkce:
Určuje cílovou hodnotu pomocí jeho Value vlastnosti.
Určuje čas, kdy má být tato hodnota dosaženo pomocí jeho KeyTime vlastnosti.
Interpoluje mezi hodnotou předchozího rámce klíče a vlastní hodnotou implementací metody InterpolateValueCore.
Pokyny k implementaci
Odvozujte 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 rámce klíče a hodnotu průběhu, která se pohybuje od 0 do 1. Průběh 0 označuje právě spuštěný klíčový snímek a hodnota 1 označuje, že se snímek klíče právě dokončil a měl by vrátit hodnotu určenou jeho Value vlastností.
Vzhledem k tomu, že třídy *<Type>*KeyFrame dědí z Freezable třídy, musíte také přepsat CreateInstanceCore jádro, aby se vrátila nová instance vaší třídy. Pokud třída nepoužívá vlastnosti závislosti 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 tématu Zmrazené objekty Přehled .
Po vytvoření vlastní animace *<Type>*KeyFrame ho můžete použít s prvky *<Type>*AnimationUsingKeyFrames pro tento typ.
Vytvoření vlastní třídy animace
Vytvoření vlastního typu animace vám dává větší kontrolu nad tím, jak se objekt v animovaném prostředí. Existují dva doporučené způsoby, jak vytvořit vlastní typ animace: můžete odvodit z AnimationTimeline třídy nebo *<Type>*AnimationBase třída. Odvození z třídy *<Type>*Animation nebo *<Type>*AnimationUsingKeyFrames se nedoporučuje.
Odvození od <Type>AnimationBase
Odvození z třídy *<Type>*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í *<Type>*AnimationBase třída.
Pokyny k implementaci
Odvození z *<Type>*Animation třídy a implementace 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 hodnotu AnimationClock, kterou použijete k určení průběhu animace.
Protože *<Type>*AnimationBase třídy dědí z Freezable třídy, musíte také přepsat CreateInstanceCore jádro, aby se vrátila nová instance třídy. Pokud třída nepoužívá vlastnosti závislosti 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 tématu Zmrazené objekty Přehled .
Další informace naleznete v dokumentaci metody GetCurrentValueCore pro *<Type>*AnimationBase třídy pro typ, který chcete animovat. Příklad najdete v ukázce vlastní animace.
Alternativní přístupy
Pokud chcete jednoduše změnit způsob interpolace hodnot animace, zvažte odvození z jedné z tříd *<Type>*KeyFrame. Snímek klíče, který vytvoříte, lze použít s odpovídajícími prvky *<Type>*AnimationUsingKeyFrame, které poskytuje WPF.
Odvození od animationTimeline
Odvozujte od AnimationTimeline třídy, pokud chcete vytvořit animaci pro typ, který ještě nemá odpovídající animaci WPF, nebo chcete vytvořit animaci, která není silného typu.
Pokyny k implementaci
Odvozujte z AnimationTimeline třídy a přepište následující členy:
CreateInstanceCore – Pokud je vaše nová třída betonová, musíte přepsat CreateInstanceCore , aby se vrátila nová instance třídy.
GetCurrentValue – Přepsat tuto metodu vrátit aktuální hodnotu animace. Přebírá tři parametry: výchozí počáteční hodnotu, výchozí cílovou hodnotu a hodnotu AnimationClock. Použijte k AnimationClock získání aktuálního času nebo průběhu animace. Můžete zvolit, jestli se mají použít výchozí počáteční a cílové hodnoty.
IsDestinationDefault – Přepsat tuto vlastnost 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ýstup, který animace vytvoří.
Pokud třída nepoužívá vlastnosti závislosti 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 tématu Zmrazené objekty Přehled .
Doporučené paradigma (používané animacemi WPF) je použít dvě úrovně dědičnosti:
Vytvořte abstraktní *<Type>*AnimationBase třída, která je odvozena od 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 výchozí hodnoty původu a výchozí cílové hodnoty parametry a pak volá GetCurrentValueCore.
Vytvořte další třídu, která dědí z vaší nové *<Type>*AnimationBase třídy a přepíše metodu CreateInstanceCore , GetCurrentValueCore metodu, kterou jste zavedli, a IsDestinationDefault vlastnost.
Alternativní přístupy
Pokud chcete animovat typ, který nemá žádnou odpovídající animaci od/do/podle animace nebo animaci s klávesovými snímky, 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žití zpětného volání podle rámce
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 vytvářet vlastní animaci animační třídu nebo třídu snímku klíče.
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 zařadí trvalá vykreslovaná data ve vizuálním stromu do stromu složení, volá se metoda obslužné rutiny 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 prezentační čas aktuálního rámce, EventArgs může být přidružena k této události přetypování jako RenderingEventArgs, která poskytuje RenderingTime vlastnost, kterou můžete použít k získání doby vykreslování aktuálního rámce.
Další informace najdete na Rendering stránce.
Viz také
.NET Desktop feedback