При анимации общих элементов существуют некоторые особые случаи использования, для которых существуют особые рекомендации.
Асинхронные изображения
Обычно библиотека используется для асинхронной загрузки изображения, например, при использовании компонуемого элемента AsyncImage
от Coil . Чтобы он работал без проблем между двумя компонуемыми элементами, рекомендуется установить 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
для общих переходов.