Riepilogo del capitolo 22. Animazione
Nota
Questo libro è stato pubblicato nella primavera del 2016, e non è stato aggiornato da allora. C'è molto nel libro che rimane prezioso, ma alcuni materiali sono obsoleti, e alcuni argomenti non sono più completamente corretti o completi.
Si è visto che è possibile creare animazioni personalizzate usando il Xamarin.Forms timer o Task.Delay
, ma in genere è più semplice usare le strutture di animazione fornite da Xamarin.Forms. Tre classi implementano queste animazioni:
ViewExtensions
, l'approccio generaleAnimation
, più versatile ma più difficileAnimationExtension
, l'approccio più versatile e di livello più basso
In genere, le animazioni sono proprietà di destinazione supportate da proprietà associabili. Questo non è un requisito, ma queste sono le uniche proprietà che reagiscono dinamicamente alle modifiche.
Non esiste un'interfaccia XAML per queste animazioni, ma puoi integrare le animazioni in XAML usando tecniche descritte nel capitolo 23. Trigger e comportamenti.
Esplorazione delle animazioni di base
Le funzioni di animazione di base sono metodi di estensione disponibili nella ViewExtensions
classe . Questi metodi si applicano a qualsiasi oggetto che deriva da VisualElement
. Le animazioni più semplici sono destinate alle proprietà delle trasformazioni descritte in Chapter 21. Transforms
.
AnimationTryout illustra come il Clicked
gestore eventi di un Button
oggetto può chiamare il RotateTo
metodo di estensione per ruotare il pulsante in un cerchio.
Il RotateTo
metodo modifica la Rotation
proprietà di Button
da 0 a 360 nel corso di un quarto di secondo (per impostazione predefinita). Se l'oggetto Button
viene toccato di nuovo, tuttavia, non esegue alcuna operazione perché la Rotation
proprietà è già di 360 gradi.
Impostazione della durata dell'animazione
Il secondo argomento di RotateTo
è una durata in millisecondi. Se impostato su un valore elevato, toccando Button
durante un'animazione viene avviata una nuova animazione a partire dall'angolo corrente.
Animazioni relative
Il RelRotateTo
metodo esegue una rotazione relativa aggiungendo un valore specificato al valore esistente. Questo metodo consente di Button
toccarlo più volte e ogni volta aumenta la Rotation
proprietà di 360 gradi.
Animazioni in attesa
Tutti i metodi di animazione negli ViewExtensions
oggetti restituiti Task<bool>
. Ciò significa che è possibile definire una serie di animazioni sequenziali usando ContinueWith
o await
. Il bool
valore restituito di completamento è false
se l'animazione è stata completata senza interruzioni o true
se è stata annullata dal CancelAnimation
metodo , che annulla tutte le animazioni avviate dall'altro metodo in ViewExtensions
che sono impostate sullo stesso elemento.
Animazioni composite
Puoi combinare animazioni attese e non attese per creare animazioni composite. Queste sono le animazioni in ViewExtensions
che hanno come destinazione le TranslationX
proprietà , TranslationY
e Scale
transform:
Si noti che TranslateTo
potenzialmente influisce sulle TranslationX
proprietà e TranslationY
.
Task.WhenAll e Task.WhenAny
È anche possibile gestire animazioni simultanee usando Task.WhenAll
, che segnala quando più attività hanno tutte concluso, e Task.WhenAny
, che segnala quando la prima di diverse attività è terminata.
Rotazione e ancoraggi
Quando si chiamano i ScaleTo
metodi , RotateTo
RelScaleTo
, e , è possibile impostare le AnchorX
proprietà e RelRotateTo
AnchorY
per indicare il centro di ridimensionamento e rotazione.
CircleButton illustra questa tecnica ruotando un Button
oggetto intorno al centro della pagina.
Funzioni di interpolazione
In genere le animazioni sono lineari da un valore iniziale a un valore finale. Le funzioni di interpolazione possono causare l'accelerazione o il rallentamento delle animazioni nel corso. L'ultimo argomento facoltativo per i metodi di animazione è di tipo Easing
, una classe che definisce 11 campi statici di sola lettura di tipo Easing
:
Linear
, impostazione predefinitaSinIn
,SinOut
eSinInOut
CubicIn
,CubicOut
eCubicInOut
BounceIn
eBounceOut
SpringIn
eSpringOut
Il In
suffisso indica che l'effetto si trova all'inizio dell'animazione, Out
significa alla fine e InOut
significa che si trova all'inizio e alla fine dell'animazione.
L'esempio BounceButton illustra l'uso delle funzioni di interpolazione.
Funzioni di interpolazione personalizzate
È anche possibile definire funzioni di interpolazione personalizzate passando un Func<double, double>
oggetto al Easing
costruttore . Easing
definisce anche una conversione implicita da Func<double, double>
a Easing
. L'argomento della funzione di interpolazione è sempre compreso nell'intervallo da 0 a 1 perché l'animazione procede in modo lineare dall'inizio alla fine. La funzione restituisce in genere un valore compreso nell'intervallo compreso tra 0 e 1, ma potrebbe essere brevemente negativo o maggiore di 1 (come accade con le SpringIn
funzioni e SpringOut
) o potrebbe interrompere le regole se si sa cosa si sta facendo.
L'esempio UneasyScale illustra una funzione di interpolazione personalizzata e CustomCubicEase ne illustra un altro.
L'esempio SwingButton illustra anche una funzione di interpolazione personalizzata e una tecnica di modifica delle AnchorX
proprietà e AnchorY
all'interno di una sequenza di animazioni di rotazione.
La Xamarin.Formslibreria Book.Toolkit include una classe che usa una JiggleButton
funzione di interpolazione personalizzata per attivare un pulsante quando viene fatto clic. L'esempio JiggleButtonDemo lo illustra.
Animazioni di ingresso
Un tipo di animazione comune si verifica quando viene visualizzata per la prima volta una pagina. Tale animazione può essere avviata nell'override OnAppearing
della pagina. Per queste animazioni, è preferibile configurare il codice XAML per la modalità di visualizzazione della pagina dopo l'animazione, quindi inizializzare e animare il layout dal codice.
L'esempio FadingEntrance usa il FadeTo
metodo di estensione per dissolversi nel contenuto della pagina.
L'esempio SlidingEntrance usa il TranslateTo
metodo di estensione per scorrere il contenuto della pagina dai lati.
L'esempio SwingingEntrance usa il RotateYTo
metodo di estensione per animare la RotationY
proprietà. È disponibile anche un RotateXTo
metodo.
Animazioni per sempre
All'altro estremo, le animazioni "per sempre" vengono eseguite fino a quando il programma non viene terminato. Questi sono in genere destinati a scopi dimostrativi.
L'esempio FadingTextAnimation usa l'animazione FadeTo
per dissolvere due parti di testo in entrata e in uscita.
PalindromeAnimation visualizza un palindromo, quindi ruota in sequenza le singole lettere di 180 gradi in modo che siano tutte capovolte. Quindi l'intera stringa viene capovolta di 180 gradi per leggere la stessa stringa originale.
L'esempio CopterAnimation ruota un semplice BoxView
elicottero mentre lo ruota intorno al centro dello schermo.
RotazioneSpoke ruota BoxView
gli spoke intorno al centro dello schermo e quindi ruota ogni spoke stesso per creare modelli interessanti:
Tuttavia, l'aumento progressivo della Rotation
proprietà di un elemento potrebbe non funzionare a lungo termine, come illustrato nell'esempio RotationBreakdown .
L'esempio SpinningImage usa RotateTo
, RotateXTo
e RotateYTo
per farlo sembrare come se una bitmap ruotasse nello spazio 3D.
Animazione della proprietà bounds
L'unico metodo di estensione in ViewExtensions
non ancora illustrato è LayoutTo
, che anima in modo efficace la proprietà di sola lettura Bounds
chiamando il Layout
metodo . Questo metodo viene in genere chiamato da Layout
derivati come verrà discusso nel capitolo 26. CustomLayouts.
Il LayoutTo
metodo deve essere limitato a scopi speciali. Il programma BouncingBox lo usa per comprimere ed espandere un mentre BoxView
rimbalza sui lati di una pagina.
L'esempio XamagonXuzzle usa LayoutTo
per spostare i riquadri in un'implementazione del classico puzzle da 15 a 16 che visualizza un'immagine scrambled anziché riquadri numerati:
Animazioni awaitable personalizzate
L'esempio TryAwaitableAnimation crea un'animazione awaitable. La classe cruciale che può restituire un Task
oggetto dal metodo e segnalare quando l'animazione viene completata è TaskCompletionSource
.
Approfondimento delle animazioni
Il Xamarin.Forms sistema di animazione può creare confusione. Oltre alla Easing
classe , il sistema di animazione comprende le ViewExtensions
classi , Animation
e AnimationExtension
.
Classe ViewExtensions
Hai già visto ViewExtensions
. Definisce nove metodi che restituiscono Task<bool>
e CancelAnimations
. Sette dei nove metodi hanno come destinazione le proprietà di trasformazione. Gli altri due sono FadeTo
, che ha come destinazione la Opacity
proprietà e LayoutTo
, che chiama il Layout
metodo .
Classe animation
La Animation
classe ha un costruttore con cinque argomenti per definire il callback e i metodi completati e i parametri dell'animazione.
Le animazioni figlio possono essere aggiunte con Add
, Insert
, WithConcurrent
e l'overload di WithConcurrent
.
L'oggetto animazione viene quindi avviato con una chiamata al Commit
metodo .
Classe AnimationExtensions
La AnimationExtensions
classe contiene principalmente metodi di estensione. Ci sono diverse versioni di un Animate
metodo e il metodo generico Animate
è così versatile che è davvero l'unica funzione di animazione necessaria.
Uso della classe Animation
L'esempio ConcurrentAnimations illustra la Animation
classe con diverse animazioni.
Animazioni figlio
L'esempio ConcurrentAnimations illustra anche le animazioni figlio, che usano i metodi e Insert
i metodi (molto simili). Add
Oltre i metodi di animazione di alto livello
L'esempio ConcurrentAnimations illustra anche come eseguire animazioni che vanno oltre le proprietà di destinazione dei ViewExtensions
metodi. In un esempio, una serie di periodi si ottiene più a lungo; in un altro esempio, una BackgroundColor
proprietà viene animata.
Altri metodi awaitable
Il TranslateTo
metodo di ViewExtensions
non funziona con la Easing.SpringOut
funzione . Si arresta quando l'output dell'interpolazione supera 1.
La Xamarin.Formslibreria Book.Toolkit contiene una MoreViewExtensions
classe con TranslateXTo
metodi di estensione e TranslateYTo
che non presentano questo problema, nonché CancelTranslateXTo
metodi e CancelTranslateYTo
per annullare tali animazioni.
SpringSlidingEntrance illustra il TranslateXTo
metodo .
La MoreExtensions
classe contiene anche un TranslateXYTo
metodo di estensione che combina la conversione X e Y e un CancelTranslateXYTo
metodo.
Implementazione di un'animazione di Bézier
È anche possibile sviluppare un'animazione che sposta un elemento lungo il percorso di una spline di Bézier. La Xamarin.Formslibreria Book.Toolkit contiene una struttura che incapsula una BezierSpline
spline di Bezier e un'enumerazione BezierTangent
per controllare l'orientamento.
La MoreViewExtensions
classe contiene un BezierPathTo
metodo di estensione e un CancelBezierPathTo
metodo .
L'esempio di BezierLoop illustra l'animazione di un elemento lungo un percorso beizer.
Uso di AnimationExtensions
Un tipo di animazione mancante nella raccolta standard è un'animazione a colori. Il problema è che non esiste un modo giusto per eseguire l'interpolazione tra due Color
valori. È possibile interpolare i singoli valori RGB, ma altrettanto validi esegue l'interpolazione dei valori HSL.
Per questo motivo, la MoreViewExtensions
classe nella Xamarin.Formslibreria Book.Toolkit contiene due Color
metodi di animazione: RgbColorAnimation
e .HslColorAnimation
Sono disponibili anche due metodi di annullamento: CancelRgbColorAnimation
e CancelHslColorAnimation
.
Entrambi i metodi usano ColorAnimation
, che esegue l'animazione chiamando il metodo generico Animate
esteso in AnimationExtensions
.
L'esempio ColorAnimations illustra l'uso di questi due tipi di animazioni a colori.
Strutturazione delle animazioni
A volte è utile esprimere le animazioni in XAML e usarle insieme a MVVM. Questo argomento è trattato nel capitolo successivo, capitolo 23. Trigger e comportamenti.