W przypadku animacji wspólnych elementów istnieją pewne szczególne przypadki, dla których mamy specjalne rekomendacje.
Obrazy asynchroniczne
Często używa się biblioteki do asynchronicznego wczytywania obrazu, na przykład podczas korzystania z komponentu AsyncImage
w bibliotece Coil.
Aby zapewnić płynną współpracę między 2 komponowalnymi, zalecamy ustawienie wartości placeholderMemoryCacheKey()
i memoryCacheKey()
jako ciągu znaków pochodzącego z klucza elementu współdzielonego, tak aby klucz pamięci podręcznej był taki sam w przypadku dopasowanych elementów współdzielonych. Nowy element współdzielony będzie używać pamięci podręcznej dopasowania jako zastępnika, dopóki nie wczyta nowego obrazu.
Typowe zastosowanie pola AsyncImage
:
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 ) )
Tekst
Aby animować zmiany fontSize
, użyj elementów Modifier.sharedBounds()
i resizeMode =
ScaleToBounds()
. Dzięki temu przejście zmiana rozmiaru jest płynna. Parametr contentScale
można dostosować, aby animować określony styl lub grubość czcionki.
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() ) )
TextAlign
zmiany są domyślnie nie animowane. Zamiast tego użyj Modifier.wrapContentSize() / Modifier.wrapContentWidth()
zamiast różnych TextAlign
w przypadku udostępnionych przejść.