使用系统返回 API 时,您可以选择接收应用内动画并支持自定义转场效果。
选择启用后,您的应用会显示“返回主屏幕”、跨 activity 和跨任务的动画。
该视频展示了使用 Android 的“设置”应用实现的跨 activity 和“返回主屏幕”预测性返回动画的简短示例。
- 在动画中,用户滑回先前的“设置”界面,这是一个跨 activity 动画示例。
- 现在,在上一个界面上,用户又开始再滑动一次,系统会显示主屏幕及壁纸的预览,即“返回主屏幕”动画的示例。
- 用户继续向右滑动,此时系统显示了窗口如何缩小为主屏幕上的图标的动画。
- 用户现已完全返回主屏幕。
详细了解如何添加对预测性返回手势的支持。
添加自定义应用内转场效果和动画
您可以创建自定义应用内属性动画和转场效果、自定义跨 activity 动画,以及自定义跨 fragment 动画(带有预测性返回手势)。
在 Jetpack Compose 中添加自定义过渡
您可以使用 PredictiveBackHandler 在 Jetpack Compose 中处理预测性返回手势,以创建自定义应用内转换。此功能适用于 androidx.activity:activity-compose:1.8.0-alpha01 或更高版本。
PredictiveBackHandler 提供了一个回调 lambda,用于公开 Flow<BackEventCompat>,该对象会在用户从边缘向后滑动时发出事件。这些事件提供有关用户触摸位置、滑动边缘的信息,最重要的是 progress,可用于在处理返回手势时将组件动画化为消失。
以下代码段展示了如何使用 PredictiveBackHandler 通过手势进度来动画显示 Surface 缩小并移开:
@Composable fun DetailScreen(onBack: () -> Unit) { var scale by remember { mutableFloatStateOf(1f) } var xOffset by remember { mutableFloatStateOf(0f) } val scope = rememberCoroutineScope() PredictiveBackHandler { progressFlow -> try { progressFlow.collectLatest { backEvent -> scale = 1f - backEvent.progress xOffset = backEvent.progress * 100f } // User completed gesture onBack() } catch (e: CancellationException) { // User cancelled gesture // Animate scale and xOffset back to 1f and 0f respectively scope.launch { animate(scale, 1f) { value, _ -> scale = value } } scope.launch { animate(xOffset, 0f) { value, _ -> xOffset = value } } } } Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Surface( modifier = Modifier .size(200.dp) .scale(scale) .offset(x = xOffset.dp, y = 0.dp), color = Color.Blue ) {} } }