DeferredAnimatedContentSample
@OptIn(ExperimentalDeferredTransitionApi::class)
@Sampled
@Composable
fun DeferredAnimatedContentSample() {
// In a real app, these states would be driven by a gesture handler like PredictiveBackHandler
val targetScreen by remember { mutableIntStateOf(0) }
val isBackGestureInProgress by remember { mutableStateOf(false) }
val swipeOffset by remember { mutableStateOf(IntOffset.Zero) }
val transitionState = remember { DeferredTransitionState(targetScreen) }
val transition = rememberDeferredTransition(transitionState)
LaunchedEffect(isBackGestureInProgress, targetScreen) {
if (isBackGestureInProgress) {
transitionState.defer(targetScreen)
} else {
transitionState.animateTo(targetScreen)
}
}
transition.DeferredAnimatedContent(
transitionSpec = { slideInHorizontally { it } togetherWith slideOutHorizontally { -it } },
mutableTransformSpec = {
MutableContentTransform {
if (isBackGestureInProgress && targetScreen < transitionState.targetState) {
// Shift the entering and exiting screens based on swipe offset
targetContentTransform { offset = swipeOffset }
initialContentTransform {
offset = swipeOffset.copy(swipeOffset.x / 2, swipeOffset.y / 2)
}
}
}
},
) { screen ->
Box(Modifier.size(200.dp).background(if (screen % 2 == 0) Color.Blue else Color.Green)) {
Text("Screen $screen")
}
}
}
TransitionExtensionAnimatedContentSample
@Sampled
@Composable
fun TransitionExtensionAnimatedContentSample() {