Una transizione personalizzata consente di creare un'animazione che non è disponibile in nessuno di le classi di transizione integrate. Ad esempio, puoi definire una transizione personalizzata che il colore in primo piano del testo e dei campi di immissione in grigio per indicare che i campi sono disattivati. nella nuova schermata. Questo tipo di modifica consente agli utenti di visualizzare i campi che hai disattivato.
Una transizione personalizzata, come uno dei tipi di transizione integrati, applica animazioni a le visualizzazioni figlio di entrambe le scene iniziali e finali. Tuttavia, a differenza dei tipi di transizione integrati, devi fornire il codice che acquisisce i valori delle proprietà e genera le animazioni. Potresti anche voler definire un sottoinsieme di visualizzazioni target per l'animazione.
Questa pagina ti insegna come acquisire i valori delle proprietà e generare animazioni per creare transizioni personalizzate.
Estendi la classe Transizione
Per creare una transizione personalizzata, aggiungi al progetto una classe che estende la classe Transition
e sostituisci le funzioni mostrate nel seguente snippet:
Kotlin
class CustomTransition : Transition() { override fun captureStartValues(transitionValues: TransitionValues) {} override fun captureEndValues(transitionValues: TransitionValues) {} override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? {} }
Java
public class CustomTransition extends Transition { @Override public void captureStartValues(TransitionValues values) {} @Override public void captureEndValues(TransitionValues values) {} @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {} }
Le sezioni seguenti spiegano come eseguire l'override di queste funzioni.
Acquisisci i valori delle proprietà di una vista
Le animazioni delle transizioni utilizzano il sistema di animazione delle proprietà descritto in Panoramica dell'animazione della proprietà. Proprietà le animazioni modificano una proprietà di visualizzazione da un valore iniziale a un valore finale rispetto a un valore specificato di tempo, quindi il framework deve avere sia il valore iniziale che quello finale la proprietà per creare l'animazione.
Tuttavia, l'animazione di una proprietà di solito richiede solo un piccolo sottoinsieme di tutte le proprietà della vista e i relativi valori. Ad esempio, un'animazione a colori richiede valori di proprietà colore, mentre un movimento l'animazione richiede i valori delle proprietà di posizione. Poiché i valori della proprietà necessari per un'animazione sono specifiche di una transizione, il framework delle transizioni non fornisce il valore di tutte le proprietà a una transizione. Il framework richiama invece le funzioni di callback che consentono una transizione acquisire solo i valori delle proprietà di cui ha bisogno e archiviarli nel framework.
Acquisisci valori iniziali
Per passare i valori della vista iniziale al framework, implementa la classe
captureStartValues(transitionValues)
personalizzata. Il framework chiama questa funzione per ogni vista nella scena iniziale. La funzione
è un oggetto TransitionValues
che contiene un riferimento
alla vista e a un'istanza Map
in cui puoi archiviare i valori della vista
desiderato. Nell'implementazione, recupera questi valori delle proprietà e ritrasmettili alla
archiviandoli nella mappa.
Per garantire che la chiave per il valore di una proprietà non sia in conflitto con altri
TransitionValues
chiavi, usa il seguente schema di denominazione:
package_name:transition_name:property_name
Il seguente snippet mostra un'implementazione della funzione captureStartValues()
:
Kotlin
class CustomTransition : Transition() { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private val PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background" override fun captureStartValues(transitionValues: TransitionValues) { // Call the convenience method captureValues captureValues(transitionValues) } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private fun captureValues(transitionValues: TransitionValues) { // Get a reference to the view val view = transitionValues.view // Store its background property in the values map transitionValues.values[PROPNAME_BACKGROUND] = view.background } ... }
Java
public class CustomTransition extends Transition { // Define a key for storing a property value in // TransitionValues.values with the syntax // package_name:transition_class:property_name to avoid collisions private static final String PROPNAME_BACKGROUND = "com.example.android.customtransition:CustomTransition:background"; @Override public void captureStartValues(TransitionValues transitionValues) { // Call the convenience method captureValues captureValues(transitionValues); } // For the view in transitionValues.view, get the values you // want and put them in transitionValues.values private void captureValues(TransitionValues transitionValues) { // Get a reference to the view View view = transitionValues.view; // Store its background property in the values map transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground()); } ... }
Acquisisci i valori finali
Il framework chiama la funzione captureEndValues(TransitionValues)
una volta per ogni vista target nella scena finale. In tutti gli altri aspetti, captureEndValues()
funziona come captureStartValues()
.
Il seguente snippet di codice mostra un'implementazione della funzione captureEndValues()
:
Kotlin
override fun captureEndValues(transitionValues: TransitionValues) { captureValues(transitionValues) }
Java
@Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); }
In questo esempio, captureStartValues()
e captureEndValues()
richiamano captureValues()
per recuperare e archiviare i valori. La proprietà vista
recuperato da captureValues()
è lo stesso, ma ha valori diversi nelle
iniziare e terminare le scene. Il framework mantiene mappe separate per l'inizio e la fine
gli stati di una vista.
Crea un animatore personalizzato
Per animare le modifiche a una vista tra il suo stato nella scena iniziale e il suo stato in
la scena finale, utilizza un animatore sostituendo
createAnimator()
personalizzata. Quando il framework chiama questa funzione, passa alla vista radice della scena e
TransitionValues
oggetti contenenti i valori iniziali e finali
che hai acquisito.
Il numero di volte in cui il framework chiama la funzione createAnimator()
dipende dalla
cambiamenti che avvengono tra la scena iniziale e quella finale.
Ad esempio, considera una dissolvenza in uscita o
animazione di dissolvenza in entrata implementata come transizione personalizzata. Se la scena iniziale ha cinque target,
che due vengono rimossi dalla scena finale, mentre la scena finale contiene i tre target
scena iniziale più un nuovo target, il framework chiama createAnimator()
sei volte.
Tre chiamate animano le dissolvenze in uscita e in entrata dei target che rimangono in entrambe le scene
di oggetti strutturati. Altre due chiamate animano la dissolvenza dei target rimossi dalla scena finale. Uno.
anima la dissolvenza in entrata del nuovo target nella scena finale.
Per le viste target presenti sia nella scena iniziale che in quella finale, il framework fornisce
un oggetto TransitionValues
sia per startValues
che per
endValues
argomenti. Per le viste target che esistono solo nella fase iniziale
scena finale, il framework fornisce un oggetto TransitionValues
per l'argomento corrispondente e null
per l'altro.
Per implementare la funzione createAnimator(ViewGroup, TransitionValues, TransitionValues)
quando crei
una transizione personalizzata, utilizza i valori delle proprietà view che hai acquisito per creare un oggetto Animator
e restituirlo al framework. Per un'implementazione di esempio,
vedi il corso ChangeColor
in
Esempio di CustomTransizione. Per saperne di più sugli animatori delle proprietà, consulta
Animazione proprietà.
Applicare una transizione personalizzata
Le transizioni personalizzate funzionano come le transizioni integrate. Puoi applicare una transizione personalizzata utilizzando un gestore delle transizioni, come descritto in Applicare una transizione.