При анимации общих элементов есть некоторые конкретные варианты использования, для которых есть определенные рекомендации.
Асинхронные изображения
Для асинхронной загрузки изображений часто используется библиотека, например composable-функция AsyncImage из Coil.
Чтобы она работала без проблем между двумя composable-функциями, рекомендуется задать для placeholderMemoryCacheKey() и memoryCacheKey() один и тот же ключ в виде строки, полученной из ключа общего элемента. Тогда ключ кеша будет одинаковым для совпадающих общих элементов. Новый общий элемент будет использовать кеш своего совпадения в качестве заполнителя, пока не загрузит новое изображение.
Обычно 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 ) )
Текст
Чтобы анимировать изменения fontSize, используйте Modifier.sharedBounds(), resizeMode =
ScaleToBounds(). Этот переход делает изменение размера
относительно плавным. Параметр contentScale можно настроить для анимации определенной насыщенности или стиля шрифта.
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 по умолчанию не анимируются. Вместо этого используйте Modifier.wrapContentSize() или Modifier.wrapContentWidth(), а не разные TextAlign для общих переходов.