Cenni preliminari sull'animazione e sul sistema di temporizzazione

In questo argomento viene descritto in che modo il sistema di temporizzazione usa l'animazione, Timelinele classi e Clock per animare le proprietà.

Prerequisiti

Per comprendere questo argomento, è necessario essere in grado di usare animazioni WPF per animare le proprietà, come descritto in Cenni preliminari sull'animazione. È anche utile conoscere le proprietà di dipendenza. Per altre informazioni, vedere Cenni preliminari sulle proprietà di dipendenza.

Sequenze temporali e orologi

La panoramica dell'animazione ha descritto come un Timeline oggetto rappresenta un segmento di tempo e un'animazione è un tipo di che produce valori di Timeline output. Da solo, un oggetto Timelinenon esegue operazioni diverse da descrivere solo un segmento di tempo. Si tratta dell'oggetto Clock della sequenza temporale che esegue il lavoro reale. Analogamente, l'animazione non anima effettivamente le proprietà: una classe di animazione descrive come calcolare i valori di output, ma è l'oggetto Clock creato per l'animazione che determina l'output dell'animazione e lo applica alle proprietà.

Un Clock è un tipo speciale di oggetto che mantiene lo stato di runtime correlato alla tempistica per l'oggetto Timeline. Fornisce tre bit di informazioni essenziali per l'animazione e il sistema di temporizzazione: CurrentTime, CurrentProgresse CurrentState. Un Clock oggetto determina l'ora corrente, lo stato e lo stato usando i comportamenti di intervallo descritti da Timeline: Duration, RepeatBehavior, AutoReversee così via.

Nella maggior parte dei casi, un Clock oggetto viene creato automaticamente per la sequenza temporale. Quando si anima usando un Storyboard oggetto o il BeginAnimation metodo , gli orologi vengono creati automaticamente per le sequenze temporali e le animazioni e applicate alle relative proprietà di destinazione. È anche possibile creare un oggetto Clock in modo esplicito usando il metodo dell'oggetto CreateClockTimeline. Il MediaTimeline.CreateClock metodo crea un orologio del tipo appropriato per l'oggetto Timeline in cui viene chiamato. Timeline Se contiene sequenze temporali figlio, vengono creati Clock anche gli oggetti. Gli oggetti risultanti Clock vengono disposti in alberi che corrispondono alla struttura dell'albero Timeline degli oggetti da cui vengono creati.

Esistono tipi di orologi diversi per tipi di sequenze temporali diversi. Nella tabella seguente vengono illustrati i Clock tipi che corrispondono ad alcuni dei diversi Timeline tipi.

Tipo di sequenza temporale Tipo di orologio Scopo dell'orologio
Animazione (eredita da AnimationTimeline) AnimationClock Genera valori di output per una proprietà di dipendenza.
MediaTimeline MediaClock Elabora un file multimediale.
ParallelTimeline ClockGroup Raggruppa e controlla i relativi oggetti figlio Clock
Storyboard ClockGroup Raggruppa e controlla i relativi oggetti figlio Clock

È possibile applicare tutti gli AnimationClock oggetti creati alle proprietà di dipendenza compatibili usando il ApplyAnimationClock metodo .

Negli scenari a elevato utilizzo delle prestazioni, ad esempio l'animazione di un numero elevato di oggetti simili, la gestione del proprio Clock uso può offrire vantaggi in termini di prestazioni.

Orologi e gestore del tempo

Quando si animano gli oggetti in WPF, si tratta del time manager che gestisce gli Clock oggetti creati per le sequenze temporali. Il gestore del tempo è la radice di una struttura ad albero di oggetti Clock e controlla il flusso di tempo nella struttura. Un time manager viene creato automaticamente per ogni applicazione WPF ed è invisibile allo sviluppatore dell'applicazione. Ogni secondo vengono emessi numerosi e il numero effettivo di tick emessi ogni secondo varia a seconda delle risorse di sistema disponibili. Durante ognuno di questi tick, il gestore del tempo calcola lo stato di tutti gli ActiveClock oggetti nell'albero di temporizzazione.

La figura seguente illustra la relazione tra il gestore del tempo e AnimationClocke una proprietà di dipendenza animata.

Timing system components and the time manager.
Animazione di una proprietà

Quando il time manager spunta, aggiorna l'ora di ogni ActiveClock nell'applicazione. Clock Se è un oggetto AnimationClock, usa il GetCurrentValue metodo dell'oggetto AnimationTimeline da cui è stato creato per calcolare il valore di output corrente. Fornisce AnimationClock l'oggetto con l'ora AnimationTimeline locale corrente, un valore di input, che in genere è il valore di base della proprietà e un valore di destinazione predefinito. Quando si recupera il valore di una proprietà animata tramite il metodo o la GetValue relativa funzione di accesso CLR, si ottiene l'output del relativo AnimationClockoggetto .

Gruppi di orologi

La sezione precedente descrive come esistono diversi tipi di Clock oggetti per diversi tipi di sequenze temporali. La figura seguente illustra la relazione tra il gestore del tempo, un ClockGroupoggetto , e AnimationClockuna proprietà di dipendenza animata. Viene ClockGroup creato per le sequenze temporali che raggruppano altre sequenze temporali, ad esempio la Storyboard classe , che raggruppa le animazioni e altre sequenze temporali.

Timing system components with the time manager and dependency properties.
Gruppo di orologi

Composizione

È possibile associare più orologi a una singola proprietà e in tal caso ogni orologio usa il valore di output dell'orologio precedente come valore di base. La figura seguente mostra tre AnimationClock oggetti applicati alla stessa proprietà. L'orologio1 usa il valore di base della proprietà animata come input e lo usa per generare l'output. L'orologio2 accetta l'output dall'orologio1 come input e lo usa per generare l'output. L'orologio3 accetta l'output dall'orologio2 come input e lo usa per generare l'output. Quando più orologi interessano contemporaneamente una stessa proprietà, formano una catena di composizione.

Timing system components composed with multiple dependency properties.
Catena di composizione

Si noti che, anche se viene creata una relazione tra l'input e l'output AnimationClock degli oggetti nella catena di composizione, i comportamenti di intervallo non sono interessati. Clock Gli oggetti (inclusi AnimationClock gli oggetti) hanno una dipendenza gerarchica dai relativi oggetti padre Clock .

Per applicare più orologi alla stessa proprietà, usare quando ComposeHandoffBehavior si applica un'animazione Storyboard, o AnimationClock.

Tick e consolidamento degli eventi

Oltre a calcolare i valori di output, a ogni tick il gestore del tempo determina lo stato di ogni orologio e genera gli eventi appropriati.

Sebbene gli eventi tick siano piuttosto frequenti, è possibile che tra essi avvengano vari eventi. Ad esempio, un Clock oggetto potrebbe essere arrestato, avviato e arrestato di nuovo, nel qual caso il relativo CurrentState valore verrà modificato tre volte. In teoria, l'evento CurrentStateInvalidated potrebbe essere generato più volte in un singolo tick. Tuttavia, il motore di temporizzazione consolida gli eventi, in modo che l'evento CurrentStateInvalidated possa essere generato al massimo una volta per tick. Questo vale per tutti gli eventi di intervallo: al massimo un evento di ogni tipo viene generato per un determinato Clock oggetto.

Quando un Clock oggetto cambia gli stati e torna allo stato originale tra i tick , ad esempio passando da Active a e Stopped di nuovo a Active, l'evento associato si verifica ancora.

Per altre informazioni sugli eventi di temporizzazione, vedere Cenni preliminari sugli eventi di tempo.

Valori correnti e valori di base delle proprietà

A una proprietà che è possibile animare possono essere associati due valori, uno di base e uno corrente. Quando si imposta la proprietà usando la funzione di accesso CLR o il SetValue metodo , si imposta il relativo valore di base. Quando una proprietà non è animata, i valori di base e corrente corrispondono.

Quando si anima una proprietà, imposta AnimationClock il valore corrente della proprietà. Il recupero del valore della proprietà tramite la funzione di accesso CLR o il GetValue metodo restituisce l'output di AnimationClock quando AnimationClock è Active o Filling. È possibile recuperare il valore di base della proprietà usando il GetAnimationBaseValue metodo .

Vedi anche