Cuando animas elementos compartidos, hay algunos casos de uso particulares que tienen recomendaciones específicas.
Imágenes asíncronas
Es común usar una biblioteca para cargar una imagen de forma asíncrona, como cuando se usa el elemento componible AsyncImage
de Coil.
Para que funcione sin problemas entre dos elementos componibles, se recomienda establecer placeholderMemoryCacheKey()
y memoryCacheKey()
en la misma clave como una cadena derivada de la clave del elemento compartido, de modo que la clave de caché sea la misma para los elementos compartidos coincidentes. El nuevo elemento compartido usará la caché de su coincidencia como marcador de posición hasta que cargue la imagen nueva.
El uso típico de AsyncImage
es el siguiente:
AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data("your-image-url") .crossfade(true) .placeholderMemoryCacheKey("image-key") // same key as shared element key .memoryCacheKey("image-key") // same key as shared element key .build(), placeholder = null, contentDescription = null, modifier = Modifier .size(120.dp) .sharedBounds( rememberSharedContentState( key = "image-key" ), animatedVisibilityScope = this ) )
Texto
Para animar los cambios de fontSize
, usa Modifier.sharedBounds()
y resizeMode =
ScaleToBounds()
. Esta transición hace que el cambio de tamaño sea relativamente fluido. El parámetro contentScale
se puede ajustar para animar un grosor o estilo de fuente específico.
Text( text = "This is an example of how to share text", modifier = Modifier .wrapContentWidth() .sharedBounds( rememberSharedContentState( key = "shared Text" ), animatedVisibilityScope = this, enter = fadeIn(), exit = fadeOut(), resizeMode = SharedTransitionScope.ResizeMode.ScaleToBounds() ) )
Los cambios de TextAlign
no se animan de forma predeterminada. En su lugar, usa Modifier.wrapContentSize() / Modifier.wrapContentWidth()
en lugar de usar diferentes TextAlign
para transiciones compartidas.