Cenni preliminari sulle animazioni personalizzate

In questo argomento viene descritto come e quando estendere il sistema di animazione WPF creando fotogrammi chiave personalizzati, classi di animazione o usando il callback per fotogrammi per ignorarlo.

Prerequisiti

Per comprendere questo argomento, è necessario avere familiarità con i diversi tipi di animazioni fornite da WPF. Per altre informazioni, vedere Cenni preliminari sulle animazioni From/To/By, Cenni preliminari sulle animazioni con fotogrammi chiave e Panoramica sulle animazioni tracciato.

Poiché le classi di animazione ereditano dalla Freezable classe , è necessario avere familiarità con Freezable gli oggetti e come ereditare da Freezable. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.

Estensione del sistema di animazione

Esistono diversi modi per estendere il sistema di animazione WPF, a seconda del livello di funzionalità predefinite che si vuole usare. Nel motore di animazione WPF sono presenti tre punti di estendibilità principali:

  • Creare un oggetto fotogramma chiave personalizzato ereditando da una delle classi *<Type>*KeyFrame, ad esempio DoubleKeyFrame. Questo approccio usa la maggior parte delle funzionalità predefinite del motore di animazione WPF.

  • Creare una classe di animazione personalizzata ereditando da AnimationTimeline o una delle classi *<Type>*AnimationBase.

  • Usare il callback per frame per generare animazioni per frame. Questo approccio ignora completamente il sistema di animazione e di intervalli.

La tabella seguente descrive alcuni scenari per l'estensione del sistema di animazione.

Quando si vuole... Usare questo approccio
Personalizzare l'interpolazione tra i valori di un tipo con un oggetto *<Type>*AnimationUsingKeyFrames corrispondente Creare un fotogramma chiave personalizzato. Per altre informazioni, vedere la sezione Creare un fotogramma chiave personalizzato.
Personalizzare più semplicemente l'interpolazione tra i valori di un tipo con un oggetto *<Type>*Animation corrispondente. Creare una classe di animazione personalizzata che eredita dalla classe *<Type>*AnimationBase che corrisponde al tipo da animare. Per altre informazioni, vedere la sezione Create a Custom Animation Class (Creare una classe di animazione personalizzata).
Animare un tipo senza animazione WPF corrispondente Usare o ObjectAnimationUsingKeyFrames creare una classe che eredita da AnimationTimeline. Per altre informazioni, vedere la sezione Create a Custom Animation Class (Creare una classe di animazione personalizzata).
Animare più oggetti con valori che vengono calcolati a ogni frame e si basano l'ultimo set di interazioni tra oggetti. Usare il callback per frame. Per altre informazioni, vedere la sezione Usare il callback per frame.

Creare un fotogramma chiave personalizzato

La creazione di una classe di fotogramma chiave personalizzata rappresenta il modo più semplice per estendere il sistema di animazione. È consigliabile usare questo approccio quando si desidera usare un metodo di interpolazione diverso per un'animazione con fotogrammi chiave. Come descritto in Cenni preliminari sulle animazioni con fotogrammi chiave, un'animazione con fotogrammi chiave usa oggetti fotogramma chiave per generare i valori di output. Ogni oggetto fotogramma chiave esegue tre funzioni:

  • Specifica un valore di destinazione utilizzando la relativa Value proprietà .

  • Specifica l'ora in cui il valore deve essere raggiunto utilizzando la relativa KeyTime proprietà.

  • Crea un'interpolazione tra il valore del fotogramma chiave precedente e il proprio valore implementando il metodo InterpolateValueCore.

Istruzioni per l'implementazione

Derivare dalla classe astratta *<Type>*KeyFrame e implementare il metodo InterpolateValueCore. Il metodo InterpolateValueCore restituisce il valore corrente del fotogramma chiave. Accetta due parametri: il valore del fotogramma chiave precedente e un valore di avanzamento compreso tra 0 e 1. Lo stato di avanzamento 0 indica che il fotogramma chiave è stato appena avviato e il valore 1 indica che il fotogramma chiave è stato appena completato e deve restituire il valore specificato dalla relativa Value proprietà.

Poiché le classi *<Type>*KeyFrame ereditano dalla classe , è anche necessario eseguire l'override FreezableCreateInstanceCore di core per restituire una nuova istanza della classe. Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.

Dopo aver creato l'animazione personalizzata *<Type>*KeyFrame, puoi usarla con *<Type>*AnimationUsingKeyFrames per quel tipo.

Creare una classe di animazione personalizzata

La creazione di un tipo di animazione personalizzato consente un maggiore controllo sul modo in cui un oggetto viene animato. Esistono due modi consigliati per creare un tipo di animazione personalizzato: è possibile derivare dalla AnimationTimeline classe o dalla classe *<Type>*AnimationBase. Non è consigliabile derivare dalle classi *<Type>*Animation<>*AnimationUsingKeyFrames.

Derivare da <Type>AnimationBase

La derivazione da una classe *<Type>*AnimationBase è il modo più semplice per creare un nuovo tipo di animazione. Usa questo approccio quando vuoi creare una nuova animazione per il tipo che dispone già di una classe *<Type>*AnimationBase corrispondente.

Istruzioni per l'implementazione

Derivare da una classe *<Type>*Animation e implementare il metodo GetCurrentValueCore. Il metodo GetCurrentValueCore restituisce il valore corrente dell'animazione. Accetta tre parametri: un valore iniziale suggerito, un valore finale suggerito e un AnimationClockoggetto , che si usa per determinare lo stato di avanzamento dell'animazione.

Poiché le classi *<Type>*AnimationBase ereditano dalla classe , devi anche eseguire l'override FreezableCreateInstanceCore di core per restituire una nuova istanza della classe. Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.

Per altre informazioni, vedere la documentazione del metodo GetCurrentValueCore per la classe *<Type>*AnimationBase per il tipo da animare. Per un esempio, vedere Esempio di animazione personalizzata

Approcci alternativi

Se vuoi semplicemente modificare la modalità di interpolazione dei valori di animazione, valuta la derivazione da una delle classi *<Type>*KeyFrame. Il fotogramma chiave creato può essere usato con i corrispondenti *<Type>*AnimationUsingKeyFrames forniti da WPF.

Derivazione dalla classe AnimationTimeline

Derivare dalla AnimationTimeline classe quando si vuole creare un'animazione per un tipo che non dispone già di un'animazione WPF corrispondente oppure si vuole creare un'animazione non fortemente tipizzata.

Istruzioni per l'implementazione

Derivare dalla classe ed eseguire l'override AnimationTimeline dei membri seguenti:

  • CreateInstanceCore : se la nuova classe è concreta, è necessario eseguire l'override CreateInstanceCore per restituire una nuova istanza della classe.

  • GetCurrentValue – Esegui l'override di questo metodo per restituire il valore corrente dell'animazione. Accetta tre parametri: un valore di origine predefinito, un valore di destinazione predefinito e un oggetto AnimationClock. Usa per AnimationClock ottenere l'ora corrente o lo stato di avanzamento per l'animazione. L'uso dei valori predefiniti di origine e destinazione è facoltativo.

  • IsDestinationDefault – Esegui l'override di questa proprietà per indicare se l'animazione usa il valore di destinazione predefinito specificato dal GetCurrentValue metodo .

  • TargetPropertyType : eseguire l'override di questa proprietà per indicare l'output prodotto dall'animazione Type .

Se la classe non usa le proprietà di dipendenza per archiviare i dati o richiede un'altra inizializzazione dopo la creazione, potrebbe essere necessario eseguire l'override di altri metodi. Per altre informazioni, vedere Cenni preliminari sugli oggetti Freezable.

Il paradigma consigliato (usato dalle animazioni WPF) consiste nell'usare due livelli di ereditarietà:

  1. Creare una classe astratta *<Type>*AnimationBase che deriva da AnimationTimeline. Questa classe deve eseguire l'override del TargetPropertyType metodo . Dovrebbe anche introdurre un nuovo metodo astratto, GetCurrentValueCore ed eseguire l'override GetCurrentValue in modo che convalida i tipi dei parametri del valore di origine predefinito e del valore di destinazione predefinito, quindi chiama GetCurrentValueCore.

  2. Creare un'altra classe che eredita dalla nuova classe *<Type>*AnimationBase ed esegue l'override del CreateInstanceCore metodo, del metodo GetCurrentValueCore introdotto e della IsDestinationDefault proprietà .

Approcci alternativi

Se vuoi animare un tipo senza animazione From/To/By corrispondente o animazione con fotogrammi chiave, prendi in considerazione l'uso di un oggetto ObjectAnimationUsingKeyFrames. Poiché è tipizzato in modo debole, un ObjectAnimationUsingKeyFrames oggetto può animare qualsiasi tipo di valore. Lo svantaggio di questo approccio è che ObjectAnimationUsingKeyFrames supporta solo l'interpolazione discreta.

Usare il callback per frame

Usare questo approccio quando è necessario ignorare completamente il sistema di animazione WPF. Uno scenario di questo approccio è rappresentato dalle animazioni fisiche, dove a ciascun passaggio dell'animazione è necessario ricalcolare una nuova direzione o posizione degli oggetti animati in base all'ultima serie di interazioni dell'oggetto.

Istruzioni per l'implementazione

A differenza degli altri approcci descritti in questa panoramica, per usare un callback per frame non è necessario creare un'animazione personalizzata o una classe con fotogrammi chiave.

Si registra invece per l'evento Rendering dell'oggetto che contiene gli oggetti da animare. Questo metodo del gestore eventi viene chiamato una volta per ogni fotogramma. Ogni volta che WPF effettua il marshalling dei dati di rendering persistenti nella struttura ad albero visuale nell'albero di composizione, viene chiamato il metodo del gestore eventi.

Nel gestore eventi eseguire i calcoli necessari per l'effetto di animazione e impostare le proprietà degli oggetti da animare con tali valori.

Per ottenere l'ora di presentazione del frame corrente, è possibile eseguire il cast dell'oggetto EventArgs associato a questo evento come RenderingEventArgs, che fornisce una RenderingTime proprietà che è possibile usare per ottenere l'ora di rendering del frame corrente.

Per altre informazioni, vedere la Rendering pagina.

Vedi anche