Распространенные варианты использования общих элементов

При анимации общих элементов существуют некоторые особые случаи использования, для которых существуют особые рекомендации.

Асинхронные изображения

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