Ao animar elementos compartilhados, há alguns casos de uso específicos que têm recomendações específicas.
Imagens assíncronas
É comum usar uma biblioteca para carregar uma imagem de forma assíncrona, como ao
usar o elemento combinável AsyncImage
da Coil (link em inglês).
Para que ele funcione perfeitamente entre dois elementos combináveis, é recomendável definir o
placeholderMemoryCacheKey()
e o memoryCacheKey()
como a mesma chave de uma string
derivada da chave do elemento compartilhado, de modo que a chave do cache seja a mesma para os
elementos compartilhados correspondentes. O novo elemento compartilhado vai usar o cache da correspondência
como marcador de posição até carregar a nova imagem.
O uso típico de AsyncImage
é o seguinte:
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 as mudanças de fontSize
, use Modifier.sharedBounds()
, resizeMode =
ScaleToBounds()
. Essa transição torna a mudança
de tamanho relativamente fluida. O parâmetro contentScale
pode ser ajustado para animar
um peso ou estilo de fonte 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() ) )
As mudanças de TextAlign
não são animadas por padrão. Em vez disso, use
Modifier.wrapContentSize() / Modifier.wrapContentWidth()
em vez de TextAlign
diferentes para transições compartilhadas.