Översikt över anpassade animeringar
Det här avsnittet beskriver hur och när WPF-animeringssystemet ska utökas genom att skapa anpassade nyckelramar, animeringsklasser eller genom att använda återanrop per bildruta för att kringgå det.
Förutsättningar
För att förstå det här avsnittet bör du känna till de olika typerna av animeringar som tillhandahålls av WPF. Mer information finns i Från/till/med animeringsöversikten, översikten över Key-Frame-animeringaroch översikten över -sökvägsanimationer.
Eftersom animeringsklasserna ärver från klassen Freezable bör du känna till Freezable objekt och hur du ärver från Freezable. Mer information finns under översikten över frysbara objekt.
Utöka animeringssystemet
Det finns ett antal sätt att utöka WPF-animeringssystemet, beroende på vilken nivå av inbyggda funktioner du vill använda. Det finns tre primära utökningspunkter i WPF-animeringsmotorn:
Skapa ett anpassat nyckelramobjekt genom att ärva från en av *<Type>*KeyFrame-klasser, till exempel DoubleKeyFrame. Den här metoden använder de flesta av de inbyggda funktionerna i WPF-animeringsmotorn.
Skapa en egen animeringsklass genom att ärva från AnimationTimeline eller någon av *<Type>*AnimationBase-klasserna.
Använd återanrop per bildruta för att generera animeringar per bildruta. Den här metoden kringgår helt animerings- och tidsschemat.
I följande tabell beskrivs några scenarier för att utöka animeringssystemet.
När du vill... | Använd den här metoden |
---|---|
Anpassa interpoleringen mellan värden av en typ som har motsvarande *<typ>*AnimeringUsingKeyFrames | Skapa en anpassad nyckelram. Mer information finns i avsnittet Skapa en anpassad nyckelram. |
Anpassa mer än bara interpoleringen mellan värdena av en typ som har en motsvarande *<Typ>*-animering. | Skapa en anpassad animeringsklass som ärver från klassen *<Type>*AnimationBase som motsvarar den typ som du vill animera. Mer information finns i avsnittet Skapa en anpassad animeringsklass. |
Animera en typ som inte har någon motsvarande WPF-animering | Använd en ObjectAnimationUsingKeyFrames eller skapa en klass som ärver från AnimationTimeline. Mer information finns i avsnittet Skapa en anpassad animeringsklass. |
Animera flera objekt med värden som beräknas varje bildruta och baseras på den senaste uppsättningen objektinteraktioner | Använd återanrop per bildruta. Mer information finns i avsnittet |
Skapa en anpassad nyckelram
Att skapa en anpassad nyckelramsklass är det enklaste sättet att utöka animeringssystemet. Använd den här metoden när du vill använda en annan interpoleringsmetod för en nyckelramsanimering. Som beskrivs i Key-Frame Animationsöversikt, använder en nyckelramsanimering nyckelramobjekt för att generera sina utdatavärden. Varje nyckelramsobjekt utför tre funktioner:
Anger ett målvärde med hjälp av dess egenskap Value.
Anger den tidpunkt då värdet ska nås med hjälp av egenskapen KeyTime.
Interpolerar mellan värdet för den tidigare nyckelramen och dess eget värde genom att implementera metoden InterpolateValueCore.
implementeringsinstruktioner
Härled från den abstrakta klassen *<Type>*KeyFrame och implementera metoden InterpolateValueCore. Metoden InterpolateValueCore returnerar nyckelramens aktuella värde. Det tar två parametrar: värdet för den tidigare nyckelramen och ett förloppsvärde som sträcker sig från 0 till 1. Förloppet 0 anger att nyckelramen precis har startats, och värdet 1 anger att nyckelramen just har slutförts och ska returnera värdet som anges av dess Value egenskap.
Eftersom *<Type>*KeyFrame-klasserna ärver från klassen Freezable måste du också åsidosätta kärnfunktionaliteten CreateInstanceCore för att returnera en ny instans av din klass. Om klassen inte använder beroendeegenskaper för att lagra sina data eller om den kräver extra initiering när den har skapats kan du behöva åsidosätta ytterligare metoder. Mer information finns i Översikt över friserbara objekt.
När du har skapat din anpassade *<Typ>*KeyFrame-animering kan du använda den med *<Type>*AnimationUsingKeyFrames för den typen.
Skapa en anpassad animeringsklass
Genom att skapa en egen animeringstyp får du bättre kontroll över hur ett objekt animeras. Det finns två rekommenderade sätt att skapa en egen animeringstyp: du kan härleda från klassen AnimationTimeline eller klassen *<Type>*AnimationBase. Att härleda från *<Typ>*Animering- eller *<Typ>*AnimationUsingKeyFrames-klasserna är inte rekommenderat.
Härleds från <Typ>AnimationBase
Att härleda från klassen *<Type>*AnimationBase är det enklaste sättet att skapa en ny animeringstyp. Använd den här metoden när du vill skapa en ny animering för typ som redan har en motsvarande *<type>*AnimationBase-klass.
implementeringsinstruktioner
Härled från klassen *<Type>*Animation och implementera metoden GetCurrentValueCore. Metoden GetCurrentValueCore returnerar det aktuella värdet för animeringen. Det tar tre parametrar: ett föreslaget startvärde, ett föreslaget slutvärde och en AnimationClock, som du använder för att fastställa förloppet för animeringen.
Eftersom klasserna *<Type>*AnimationBase ärver från klassen Freezable måste du också åsidosätta CreateInstanceCore kärna för att returnera en ny instans av klassen. Om klassen inte använder beroendeegenskaper för att lagra sina data eller om den kräver extra initiering när den har skapats kan du behöva åsidosätta ytterligare metoder. Mer information finns i Översikt över friserbara objekt.
Mer information finns i getcurrentValueCore-metoddokumentationen för klassen *<Type>*AnimationBase för den typ som du vill animera. Ett exempel finns i Anpassad Animering-exempel
Alternativa tillvägagångssätt
Om du bara vill ändra hur animeringsvärden interpoleras bör du överväga att härleda från någon av *<Type>*KeyFrame-klasser. Nyckelramen som du skapar kan användas med motsvarande *<Typ>*AnimationUsingKeyFrames som tillhandahålls av WPF.
Härled från AnimationTimeline
Avled från klassen AnimationTimeline när du vill skapa en animering för en typ som saknar en matchande WPF-animering, eller när du vill skapa en animering som inte är starkt typad.
implementeringsinstruktioner
Härled från klassen AnimationTimeline och åsidosätt följande medlemmar:
CreateInstanceCore – Om den nya klassen är konkret måste du åsidosätta CreateInstanceCore för att returnera en ny instans av klassen.
GetCurrentValue – Åsidosätt den här metoden för att returnera det aktuella värdet för animeringen. Det tar tre parametrar: ett standardvärde för ursprung, ett standardmålvärde och en AnimationClock. Använd AnimationClock för att hämta aktuell tid eller förlopp för animeringen. Du kan välja om du vill använda standardvärdena för ursprung och mål.
IsDestinationDefault – Åsidosätt den här egenskapen för att ange om animeringen använder det standardmålvärde som anges av metoden GetCurrentValue.
TargetPropertyType – Åsidosätt den här egenskapen för att ange Type av utdata som animeringen genererar.
Om klassen inte använder beroendeegenskaper för att lagra sina data eller om den kräver extra initiering när den har skapats kan du behöva åsidosätta ytterligare metoder. Mer information finns i Översikt över friserbara objekt.
Det rekommenderade paradigmet (som används av WPF-animeringar) är att använda två arvsnivåer:
Skapa en abstrakt *<type>*AnimationBase-klass som härleds från AnimationTimeline. Den här klassen bör åsidosätta metoden TargetPropertyType. Den bör också introducera en ny abstrakt metod, GetCurrentValueCore, och åsidosätta GetCurrentValue så att den validerar typerna av standardvärdet för ursprungsvärdet och standardvärdena för målvärden och sedan anropar GetCurrentValueCore.
Skapa en annan klass som ärver från din nya *<Type>*AnimationBase-klass och åsidosätter metoden CreateInstanceCore, metoden GetCurrentValueCore som du introducerade och egenskapen IsDestinationDefault.
Alternativa angreppssätt
Om du vill animera en typ som inte har någon motsvarande från/till/efter-animering eller nyckelramsanimering bör du överväga att använda en ObjectAnimationUsingKeyFrames. Eftersom den är svagt typad kan en ObjectAnimationUsingKeyFrames animera alla typer av värden. Nackdelen med den här metoden är att ObjectAnimationUsingKeyFrames endast stöder diskret interpolering.
Använd Per-Frame-återanrop
Använd den här metoden när du helt behöver kringgå WPF-animeringssystemet. Ett scenario för den här metoden är fysikanimationer, där vid varje animeringssteg måste en ny riktning eller position för animerade objekt omberäknas baserat på den senaste uppsättningen objektinteraktioner.
implementeringsinstruktioner
Till skillnad från andra metoder som beskrivs i den här översikten behöver du inte skapa en anpassad animering eller nyckelramsklass om du vill använda återanrop per bildruta.
I stället registrerar du dig till Rendering-händelsen för objektet som innehåller de objekt som du vill animera. Den här händelsehanterarmetoden anropas en gång per bildruta. Varje gång WPF konverterar beständiga återgivningsdata i det visuella trädet till kompositionsträdet anropas händelsehanterarmetoden.
I händelsehanteraren utför du de beräkningar som krävs för animeringseffekten och anger egenskaperna för de objekt som du vill animera med dessa värden.
För att få presentationstiden för den aktuella bildrutan kan den EventArgs som är associerad med den här händelsen omvandlas till RenderingEventArgs, som har en RenderingTime-egenskap som du kan använda för att hämta den nuvarande bildrutans återgivningstid.
Mer information finns på sidan Rendering.
Se även
.NET Desktop feedback