{% setvar book_path %}/reference/androidx/_book.yaml{% endsetvar %} {% include "_shared/_reference-head-tags.html" %}

SizeTransform

public interface SizeTransform


SizeTransform defines how to transform from one size to another when the size of the content changes. When clip is true, the content will be clipped to the animation size. createAnimationSpec specifies the animation spec for the size animation based on the initial and target size.

import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.ContentTransform
import androidx.compose.animation.SizeTransform
import androidx.compose.animation.core.keyframes
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.with
import androidx.compose.ui.unit.IntSize

// enum class CartState { Expanded, Collapsed }
val transitionSpec: AnimatedContentScope<CartState>.() -> ContentTransform =
    {
        // Fade in with a delay so that it starts after fade out
        fadeIn(animationSpec = tween(150, delayMillis = 150))
            .with(fadeOut(animationSpec = tween(150)))
            .using(
                SizeTransform { initialSize, targetSize ->
                    // Using different SizeTransform for different state change
                    if (CartState.Collapsed isTransitioningTo CartState.Expanded) {
                        keyframes {
                            durationMillis = 500
                            // Animate to full target width and by 200px in height at 150ms
                            IntSize(targetSize.width, initialSize.height + 200) at 150
                        }
                    } else {
                        keyframes {
                            durationMillis = 500
                            // Animate 1/2 the height without changing the width at 150ms.
                            // The width and rest of the height will be animated in the
                            // timeframe between 150ms and duration (i.e. 500ms)
                            IntSize(
                                initialSize.width,
                                (initialSize.height + targetSize.height) / 2
                            ) at 150
                        }
                    }
                }
            )
    }

Summary

Public methods

abstract @NonNull FiniteAnimationSpec<@NonNull IntSize>
createAnimationSpec(
    @NonNull IntSize initialSize,
    @NonNull IntSize targetSize
)

This allows FiniteAnimationSpec to be defined based on the initialSize before the size animation and the targetSize of the animation.

abstract boolean

Whether the content should be clipped using the animated size.

Public methods

createAnimationSpec

abstract @NonNull FiniteAnimationSpec<@NonNull IntSizecreateAnimationSpec(
    @NonNull IntSize initialSize,
    @NonNull IntSize targetSize
)

This allows FiniteAnimationSpec to be defined based on the initialSize before the size animation and the targetSize of the animation.

getClip

abstract boolean getClip()

Whether the content should be clipped using the animated size.