Animazione (DirectComposition)
Nota
Per le app in Windows 10, ti consigliamo di usare le API Windows.UI.Composition anziché DirectComposition. Per altre info, vedi Modernizzare l'app desktop usando il livello visivo.
Questo argomento illustra le nozioni di base dell'animazione Microsoft DirectComposition. Contiene gli argomenti seguenti:
- Che cos'è un'animazione?
- Proprietà che possono essere animate
- funzioni di animazione
-
segmenti animazione
- segmento cubico
- segmento sinusoidale
- segmento Ripeti
- segmento finale
- compatibilità con Gestione animazioni di Windows
- argomenti correlati
Che cos'è un'animazione?
Animation è un'illusione ottica creata apportando rapidamente modifiche incrementali a un oggetto visivo in un periodo di tempo durante la ridisegnazione dell'oggetto visivo dopo ogni modifica. Poiché le ridisegne si verificano rapidamente, il cervello percepisce i cambiamenti incrementali come una singola scena mutevole, proprio come in un film o video di azione live.
La tabella seguente descrive alcuni dei modi tipici di usare l'animazione.
Animazione | Descrizione |
---|---|
Scorrimento | Usa l'animazione per aggiungere caratteristiche come la fisica emulando lo slancio a un controllo elenco di scorrimento. |
Transizioni di scena | Usare l'animazione per creare transizioni di scena di spostamento che garantiscono la continuità tra le attività in un flusso di lavoro. Le transizioni della scena di spostamento forniscono il contesto che mostra all'utente dove sono, dove si trovano e dove devono andare avanti. |
Interazioni tra finestre | Animare gli elementi dell'interfaccia utente di applicazioni diverse in modo da consentire all'utente di passare da un'applicazione a un'altra in modo da consentire all'utente di completare le attività che comportano il passaggio da un'applicazione a un'altra. |
Proprietà che possono essere animate
In DirectComposition anima un oggetto visivo applicando l'animazione alle singole proprietà degli oggetti che definiscono l'oggetto visivo. Ad esempio, se vuoi spostare un oggetto visivo orizzontalmente sullo schermo, applica l'animazione alla proprietà OffsetX dell'oggetto visivo. Analogamente, se vuoi eseguire una semplice rotazione 2D animata di un oggetto visivo, applica l'animazione alla proprietà Angle di un oggetto trasformazione 2D e quindi applica l'oggetto trasformazione 2D alla proprietà Transform dell'oggetto visivo.
DirectComposition consente di applicare l'animazione a qualsiasi proprietà dell'oggetto che accetta un valore scalare. È possibile applicare animazioni simultanee a più proprietà e più oggetti.
DirectComposition esegue animazioni su un thread separato. È possibile avviare un'animazione o un set di animazioni e quindi eseguire altre operazioni sui thread dell'applicazione o persino mettere i thread in sospensione, mentre il motore di composizione esegue le animazioni alla frequenza dei fotogrammi appropriata.
Funzioni di animazione
DirectComposition anima una proprietà dell'oggetto in base a una funzione di animazione definita dall'utente. Una funzione di animazione è un costrutto che specifica il modo in cui il valore di una proprietà dell'oggetto cambia in un periodo di tempo. Ad esempio, è possibile definire una funzione di animazione che modifica il valore di una proprietà da 1 a 360 nel corso di 4 secondi. Quindi, se si applica la funzione di animazione alla proprietà Angle di un oggetto di trasformazione 2D ruota e quindi si applica l'oggetto transform alla proprietà Transform di un oggetto visivo, la funzione di animazione ruota l'oggetto visivo in un cerchio completo nel corso di 4 secondi.
Una funzione di animazione è rappresentata da un oggetto animazione creato da una chiamata al metodo IDCompositionDevice::CreateAnimation. Si crea una funzione di animazione usando i metodi di un oggetto di animazione IDCompositionAnimation'interfaccia per accodare segmenti di animazione, uno alla volta, alla matrice che definisce la funzione di animazione. Quando si aggiunge un segmento, si specifica un offset in base zero che contrassegna l'ora di inizio del segmento, rispetto all'inizio della funzione di animazione. I segmenti di animazione devono essere accodati in ordine crescente di ore di inizio. Il tentativo di accodare un segmento di animazione il cui ora di inizio è precedente o uguale a un segmento precedente avrà esito negativo. Una funzione di animazione può avere un'ora di fine specificata, che indica quando la funzione deve concludersi.
Se non diversamente specificato, una funzione di animazione viene avviata quando Desktop Window Manager (DWM) riceve il comando per eseguire l'animazione. Ogni segmento viene eseguito fino al raggiungimento dell'ora di inizio del segmento successivo. Eventuali modifiche discontinue che si verificano nel valore della proprietà animata tra segmenti vengono considerate modifiche discrete.
Applicare una funzione di animazione a una proprietà impostando il valore della proprietà sul IDCompositionAnimation puntatore dell'oggetto animazione che rappresenta la funzione di animazione. Lo stesso oggetto animazione può essere applicato a più proprietà dello stesso oggetto, nonché alle proprietà di altri oggetti creati dallo stesso dispositivo.
Segmenti di animazione
I segmenti di animazione sono le definizioni di temporizzazione fondamentali di una funzione di animazione; sono le primitive da cui vengono compilate funzioni di animazione più complesse e di livello superiore. Un segmento di animazione viene costruito da una serie di parametri che descrivono la funzione e l'ora di inizio del segmento, rispetto all'inizio della funzione di animazione. Per ogni segmento, il tempo (t) avanza lungo l'asse orizzontale e inizia a t = 0.
Segmento cubico
La tempistica di un segmento cubico è definita da un polinomio cubico. Per un determinato input temporale (t), il valore di output viene fornito dall'equazione seguente:
x(t) = + bt² + ct + d
Il diagramma seguente mostra una funzione di animazione che contiene due segmenti cubici. Il primo segmento esegue la transizione di un valore da 0 a 16 oltre 4 secondi e il secondo modifica il valore in modo lineare da 16 a 0 nei successivi 4 secondi. La prima transizione avviene lungo questo polinomio cubico:
x(t) = t² - 6t² + 12t
e la seconda transizione si verifica lungo questo:
x(t) = - 4t + 16
Aggiungere un segmento cubico a una funzione di animazione usando il metodo IDCompositionAnimation::AddCubic.
Segmento sinusoidale
La tempistica di un segmento sinusoidale è definita dall'equazione seguente:
x(t) = Bias + Amplitude * sin(t*Frequency*2*PI + Phase*PI/180.0)
Aggiungere un segmento sinusoidale a una funzione di animazione usando il metodo IDCompositionAnimation::AddSinusoidal.
Segmento di ripetizione
Un segmento di ripetizione ripete una parte precedente specificata di una funzione di animazione. Un segmento di ripetizione fa in modo che la parte specificata della funzione di animazione venga eseguita a ciclo indefinito fino a quando non viene rilevato il segmento successivo o la fine specificata dell'animazione. La parte precedente di un'animazione è costituita da altri segmenti, inclusi altri segmenti di ripetizione. Non è possibile usare un segmento di ripetizione come primo segmento in una funzione di animazione.
Il diagramma seguente mostra una funzione di animazione costituita da due segmenti cubici di durata di 4 secondi ciascuno, seguito da un segmento di ripetizione che dura 12 secondi. Il segmento di ripetizione inizia 8 secondi nell'animazione e ripete i 6 secondi precedenti dell'animazione due volte fino a raggiungere il segmento finale a 20 secondi.
Per aggiungere un segmento di ripetizione a una funzione di animazione, usare il metodo IDCompositionAnimation::AddRepeat.
Segmento finale
Dopo aver costruito una funzione di animazione dai segmenti, puoi aggiungere un segmento finale per terminare la funzione di animazione in un determinato momento. Se non si aggiunge un segmento finale, il segmento finale della funzione di animazione viene eseguito per un periodo illimitato.
Aggiungere un segmento finale chiamando il metodo IDCompositionAnimation::End, specificando un offset dall'inizio della funzione di animazione che indica il punto finale della funzione. L'offset deve essere maggiore dell'offset iniziale del segmento precedente. Inoltre, un segmento finale non può essere usato come prima primitiva in una funzione di animazione.
Quando si chiama End, si specifica anche un valore finale per la proprietà animata. La proprietà viene impostata sul valore finale specificato nel momento in cui viene raggiunto il punto finale della funzione di animazione.
Dopo aver accodato un segmento finale, non è possibile accodare altri segmenti alla funzione di animazione. Ovvero, tutte le chiamate al metodo sull'oggetto animazione hanno esito negativo, ad eccezione di IDCompositionAnimation::Reset. Chiamando Reset restituisce l'oggetto animazione allo stato pulito in cui la funzione di animazione non contiene segmenti, a questo punto è possibile aggiungere nuovamente segmenti.
Compatibilità con Gestione animazioni di Windows
Windows Animation Manager (Animazione Windows) restituisce primitive di animazione in un formato compatibile con l'API DirectComposition. Ciò significa che DirectComposition può creare animazioni basate su primitive di animazione create dall'animazione di Windows.
Per altre informazioni, vedere Windows Animation Manager, il metodo IUIAnimationVariable2::GetCurve e Managing DirectComposition Animation with Windows Animation Manager v2.
Argomenti correlati