Panoramica delle 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 fotogramma per aggirare il sistema.
Prerequisiti
Per comprendere questo argomento, è necessario avere familiarità con i diversi tipi di animazioni fornite da WPF. Per ulteriori informazioni, vedere la Panoramica sulle animazioni From/To/By, la Panoramica sulle animazioni Key-Framee la Panoramica sulle animazioni Percorso.
Poiché le classi di animazione ereditano dalla classe Freezable, è necessario avere familiarità con gli oggetti Freezable e come ereditare da Freezable. Per ulteriori informazioni, vedere la Panoramica sugli Oggetti Congelabili .
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 da una delle classi *<Tipo>*AnimationBase.
Usare il callback per fotogramma per generare animazioni fotogramma per fotogramma. Questo approccio ignora completamente l'animazione e il sistema di temporizzazione.
La tabella seguente descrive alcuni scenari per estendere il sistema di animazione.
Quando vuoi... | Usare questo approccio |
---|---|
Personalizzare l'interpolazione tra i valori di un tipo che ha un tipo corrispondente *<>* AnimationUsingKeyFrames. | Crea un fotogramma chiave personalizzato. Per ulteriori informazioni, consultare la sezione Crea un fotogramma chiave personalizzato. |
Personalizzare non solo l'interpolazione tra i valori di un tipo che ha una corrispondente *<Tipo>*Animazione. | Creare una classe di animazione personalizzata che eredita dalla classe *<Type>*AnimationBase che corrisponde al tipo da animare. Per altre informazioni, vedere la sezione Creare una classe di animazione personalizzata. |
Animare un tipo per il quale non esiste un'animazione WPF corrispondente | Usare un ObjectAnimationUsingKeyFrames o creare una classe che eredita da AnimationTimeline. Per altre informazioni, vedere la sezione Creare una classe di animazione personalizzata. |
Animare più oggetti con valori calcolati per ogni fotogramma e basati sull'ultimo set di interazioni tra oggetti | Usare il callback per frame. Per altre informazioni, vedere la sezione Create a Use Per-Frame Callback . |
Creare un fotogramma chiave personalizzato
La creazione di una classe di fotogrammi chiave personalizzata è il modo più semplice per estendere il sistema di animazione. Usa questo approccio quando vuoi usare un metodo di interpolazione diverso per un'animazione con fotogrammi chiave. Come descritto nella Key-Frame panoramica delle animazioni, un'animazione con fotogrammi chiave usa gli oggetti di fotogrammi chiave per generare i valori di output. Ogni oggetto fotogramma chiave esegue tre funzioni:
Specifica un valore di destinazione utilizzando la relativa proprietà Value.
Specifica l'ora in cui il valore deve essere raggiunto utilizzando la relativa proprietà KeyTime.
Interpola tra il valore del fotogramma chiave precedente e il proprio valore implementando il metodo InterpolateValueCore.
Istruzioni di 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 progresso 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 proprietà Value.
Poiché le classi *<Type>*KeyFrame ereditano dalla classe Freezable, è anche necessario eseguire l'override di CreateInstanceCore core per restituire una nuova istanza della classe. Se la classe non usa proprietà di dipendenza per memorizzare i suoi dati o richiede un'inizializzazione aggiuntiva dopo la creazione, potrebbe essere necessario eseguire un override di metodi ulteriori; per altre informazioni, vedere la Panoramica degli Oggetti Freezable.
Dopo aver creato la tua animazione di *<Tipo>*Fotogramma chiave personalizzata, puoi usarla con *<Tipo>*AnimationUsingKeyFrames per quel tipo.
Creare una classe di animazione personalizzata
La creazione di un tipo di animazione personalizzato ti offre un maggiore controllo sulla modalità di animazione di un oggetto. Esistono due modi consigliati per creare un tipo di animazione personalizzato: è possibile derivare dalla classe AnimationTimeline o dalla classe *<Tipo>*AnimationBase. È sconsigliato derivare dalle classi *<Type>*Animation o *<Type>*AnimationUsingKeyFrames.
Derivare dalla classe <di tipo>AnimationBase
Derivare da una classe *<Type>*AnimationBase è il modo più semplice per creare una nuova tipologia di animazione. Usa questo approccio quando vuoi creare una nuova animazione per il tipo che dispone già di una corrispondente *<Tipo>*classe AnimationBase.
Istruzioni di Implementazione
Derivare da una classe di animazione *<Type>* 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 AnimationClock, che si usa per determinare lo stato di avanzamento dell'animazione.
Poiché le classi *<Type>*AnimationBase ereditano dalla classe Freezable, devi anche eseguire l'override del "core" di CreateInstanceCore per restituire una nuova istanza della tua classe. Se la classe non usa proprietà di dipendenza per archiviare i dati o richiede un'inizializzazione aggiuntiva dopo la creazione, potrebbe essere necessario eseguire l'override di metodi aggiuntivi, vedere la panoramica degli oggetti Freezable per altre informazioni.
Per ulteriori informazioni, consultare la documentazione del metodo GetCurrentValueCore per il tipo che si desidera animare nella classe *<Type>*AnimationBase. Per un esempio, vedere esempio di animazione personalizzata
Approcci Alternativi
Se vuoi semplicemente modificare la modalità di interpolazione dei valori di animazione, valuta la possibilità di derivare da una delle classi *<Type>*KeyFrame. Il fotogramma chiave creato può essere utilizzato con il tipo corrispondente *<>*AnimationUsingKeyFrames fornito da WPF.
Derivare da AnimationTimeline
Derivare dalla classe AnimationTimeline 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 AnimationTimeline ed eseguire l'override dei membri seguenti:
CreateInstanceCore: se la nuova classe è concreta, è necessario eseguire l'override di CreateInstanceCore per restituire una nuova istanza della classe.
GetCurrentValue: eseguire 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 AnimationClock. Usa AnimationClock per ricavare l'ora corrente o il progresso dell'animazione. È possibile scegliere se usare i valori di origine e di destinazione predefiniti.
IsDestinationDefault: eseguire l'override di questa proprietà per indicare se l'animazione usa il valore di destinazione predefinito specificato dal metodo GetCurrentValue.
TargetPropertyType: eseguire l'override di questa proprietà per indicare il Type di output generato dall'animazione.
Se la classe non utilizza proprietà di dipendenza per memorizzare i dati o richiede un'inizializzazione aggiuntiva dopo la creazione, potrebbe essere necessario eseguire l'override di metodi aggiuntivi; per ulteriori informazioni, vedere la panoramica degli oggetti congelabili.
Il paradigma consigliato (usato dalle animazioni WPF) consiste nell'usare due livelli di ereditarietà:
Creare una classe astratta *<di tipo>*AnimationBase che deriva da AnimationTimeline. Questa classe deve eseguire l'override del metodo TargetPropertyType. Dovrebbe anche introdurre un nuovo metodo astratto, GetCurrentValueCore ed eseguire l'override di GetCurrentValue in modo da convalidare i tipi dei parametri del valore di origine predefinito e del valore di destinazione predefinito, quindi chiama GetCurrentValueCore.
Creare un'altra classe che eredita dalla nuova classe *<Type>*AnimationBase ed esegue l'override del metodo CreateInstanceCore, del metodo GetCurrentValueCore introdotto e della proprietà IsDestinationDefault.
approcci alternativi
Se vuoi animare un tipo senza un'animazione From/To/By corrispondente o un'animazione con fotogrammi chiave, puoi considerare di utilizzare un ObjectAnimationUsingKeyFrames. Poiché è tipizzato in modo debole, un ObjectAnimationUsingKeyFrames può animare qualsiasi tipo di valore. Lo svantaggio di questo approccio è che ObjectAnimationUsingKeyFrames supporta solo l'interpolazione discreta.
Usare Per-Frame Callback
Usare questo approccio quando è necessario ignorare completamente il sistema di animazione WPF. Uno scenario per questo approccio è costituito dalle animazioni fisiche, in cui in ogni passaggio dell'animazione è necessario ricompilare una nuova direzione o posizione di oggetti animati in base all'ultimo set di interazioni tra oggetti.
Istruzioni di Implementazione
A differenza degli altri approcci descritti in questa panoramica, per usare il callback per fotogrammi non è necessario creare un'animazione personalizzata o una classe fotogramma chiave.
Invece, ci si registra per l'evento Rendering dell'oggetto che contiene gli oggetti da animare. Questo metodo del gestore eventi viene chiamato una volta per fotogramma. Ogni volta che WPF trasferisce i dati di rendering persistenti dall'albero visivo all'albero di composizione, viene chiamato il metodo del gestore degli eventi.
Nel gestore eventi esegui i calcoli necessari per l'effetto di animazione e imposta le proprietà degli oggetti che vuoi animare con questi valori.
Per ottenere l'ora di presentazione del frame corrente, è possibile eseguire il cast del EventArgs associato a questo evento come RenderingEventArgs, la quale fornisce la proprietà RenderingTime da utilizzare per ottenere il tempo di rendering del frame corrente.
Per altre informazioni, vedere la pagina Rendering.
Vedere anche
- AnimationTimeline
- IKeyFrame
- Panoramica delle tecniche di animazione delle proprietà
- Panoramica degli oggetti congelabili
- Panoramica delle animazioni Key-Frame
- Panoramica delle animazioni percorso
- Panoramica dell'animazione
- Cenni preliminari sul sistema di temporizzazione e animazione
- esempio di animazione personalizzata
.NET Desktop feedback