Cuando se animan elementos compartidos, hay algunos casos de uso particulares con 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 que 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()
, resizeMode =
ScaleToBounds()
. Esta transición hace que el cambio de tamaño sea relativamente fluido. Se puede modificar el parámetro contentScale
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 están animados de forma predeterminada. En su lugar, usa Modifier.wrapContentSize() / Modifier.wrapContentWidth()
en lugar de usar TextAlign
diferentes para las transiciones compartidas.