Per personalizzare l'esecuzione dell'animazione di transizione degli elementi condivisi, puoi utilizzare alcuni parametri per modificare la transizione degli elementi condivisi.
Specifiche dell'animazione
Per modificare la specifica dell'animazione utilizzata per il movimento di dimensioni e posizione, puoi
specificare un parametro boundsTransform
diverso in Modifier.sharedElement()
.
Vengono fornite la posizione iniziale di Rect
e la posizione di destinazione di Rect
.
Ad esempio, per far muovere il testo nell'esempio precedente con un movimento ad arco, specifica il parametro boundsTransform
per utilizzare una specifica keyframes
:
val textBoundsTransform = BoundsTransform { initialBounds, targetBounds -> keyframes { durationMillis = boundsAnimationDurationMillis initialBounds at 0 using ArcMode.ArcBelow using FastOutSlowInEasing targetBounds at boundsAnimationDurationMillis } } Text( "Cupcake", fontSize = 28.sp, modifier = Modifier.sharedBounds( rememberSharedContentState(key = "title"), animatedVisibilityScope = animatedVisibilityScope, boundsTransform = textBoundsTransform ) )
Puoi utilizzare qualsiasi AnimationSpec
. Questo esempio utilizza una specifica keyframes
.
boundsTransform
parametriModalità di ridimensionamento
Quando esegui l'animazione tra due limiti condivisi, puoi impostare il parametro resizeMode
su RemeasureToBounds
o ScaleToBounds
. Questo parametro determina il modo in cui
l'elemento condiviso esegue la transizione tra i due stati. ScaleToBounds
first
misura il layout secondario con i vincoli di lookahead (o di destinazione). Quindi, il layout stabile del bambino viene scalato per adattarsi ai limiti condivisi.
ScaleToBounds
può essere considerata una "scala grafica" tra gli stati.
Al contrario, RemeasureToBounds
misura e riorganizza il layout secondario di
sharedBounds
con vincoli fissi animati in base alle dimensioni di destinazione. La
misurazione viene attivata dalla modifica delle dimensioni dei limiti, che potrebbe
verificarsi a ogni frame.
Per i composable Text
, è consigliato ScaleToBounds
, in quanto evita il riposizionamento
e il reflow del testo su righe diverse. RemeasureToBounds
è consigliato
per i limiti con proporzioni diverse e se vuoi una continuità fluida
tra i due elementi condivisi.
La differenza tra le due modalità di ridimensionamento è visibile negli esempi riportati di seguito:
|
|
---|---|
Passa al layout finale
Per impostazione predefinita, durante la transizione tra due layout, le dimensioni del layout vengono animate tra lo stato iniziale e quello finale. Questo potrebbe essere un comportamento indesiderabile quando si animano contenuti come il testo.
L'esempio seguente illustra l'inserimento del testo della descrizione "Lorem Ipsum" sullo schermo in due modi diversi. Nel primo esempio, il testo viene riformattato man mano che
entra nel contenitore, che aumenta di dimensioni. Nel secondo esempio il testo non
viene riformattato man mano che cresce. L'aggiunta di Modifier.skipToLookaheadSize()
impedisce il reflow
man mano che cresce.
No |
|
---|---|
Clip e overlay
Affinché gli elementi condivisi vengano condivisi tra diversi composable, il rendering del composable viene elevato in un overlay di livello quando la transizione viene avviata alla sua corrispondenza nella destinazione. L'effetto è che uscirà dai limiti del genitore e dalle trasformazioni del livello (ad esempio, alfa e scala).
Verrà visualizzato sopra gli altri elementi della UI non condivisi. Una volta completata la transizione, l'elemento verrà spostato dalla sovrapposizione al proprio DrawScope
.
Per ritagliare un elemento condiviso in una forma, utilizza la funzione standard Modifier.clip()
. Posizionalo dopo sharedElement()
:
Image( painter = painterResource(id = R.drawable.cupcake), contentDescription = "Cupcake", modifier = Modifier .size(100.dp) .sharedElement( rememberSharedContentState(key = "image"), animatedVisibilityScope = this@AnimatedContent ) .clip(RoundedCornerShape(16.dp)), contentScale = ContentScale.Crop )
Se devi assicurarti che un elemento condiviso non venga mai visualizzato al di fuori di un contenitore principale, puoi impostare clipInOverlayDuringTransition
su sharedElement()
. Per impostazione predefinita, per i limiti condivisi nidificati, clipInOverlayDuringTransition
utilizza il percorso di ritaglio di sharedBounds()
.
Per supportare il mantenimento di elementi UI specifici, come una barra inferiore o un pulsante di azione
fluttuante, sempre in primo piano durante una transizione di elementi condivisi, utilizza
Modifier.renderInSharedTransitionScopeOverlay()
. Per impostazione predefinita, questo modificatore mantiene i contenuti nell'overlay durante il periodo in cui la transizione condivisa è attiva.
Ad esempio, in Jetsnack, BottomAppBar
deve essere posizionato sopra l'elemento condiviso finché lo schermo non è visibile. L'aggiunta del modificatore
al componente componibile lo mantiene elevato.
Senza |
Con |
---|---|
Potresti voler animare la scomparsa del composable non condiviso e
mantenerlo in primo piano rispetto agli altri composable prima della transizione. In questi casi, utilizza
renderInSharedTransitionScopeOverlay().animateEnterExit()
per animare
il composable in uscita durante l'esecuzione della transizione dell'elemento condiviso:
JetsnackBottomBar( modifier = Modifier .renderInSharedTransitionScopeOverlay( zIndexInOverlay = 1f, ) .animateEnterExit( enter = fadeIn() + slideInVertically { it }, exit = fadeOut() + slideOutVertically { it } ) )
Nel raro caso in cui non vuoi che l'elemento condiviso venga visualizzato in una
sovrapposizione, puoi impostare renderInOverlayDuringTransition
su sharedElement()
su false.
Notificare ai layout secondari le modifiche alle dimensioni dell'elemento condiviso
Per impostazione predefinita, sharedBounds()
e sharedElement()
non notificano al contenitore principale
eventuali modifiche delle dimensioni durante le transizioni del layout.
Per propagare le modifiche alle dimensioni al contenitore principale durante la transizione,
modifica il parametro placeHolderSize
in PlaceHolderSize.animatedSize
. In questo modo, l'elemento si ingrandisce o si rimpicciolisce. Tutti gli altri elementi del layout rispondono
alla modifica.
|
(Nota come gli altri elementi dell'elenco si spostano verso il basso in risposta all'elemento che si ingrandisce) |
---|---|