增加对预测性返回动画的支持

使用系统返回 API 时,您可以选择接收应用内动画并支持自定义转场效果。

视频 1:预测性返回动画

选择启用后,您的应用会显示“返回主屏幕”、跨 activity 和跨任务的动画。

该视频展示了使用 Android 的“设置”应用实现的跨 activity 和“返回主屏幕”预测性返回动画的简短示例。

  1. 在动画中,用户滑回先前的“设置”界面,这是一个跨 activity 动画示例。
  2. 现在,在上一个界面上,用户又开始再滑动一次,系统会显示主屏幕及壁纸的预览,即“返回主屏幕”动画的示例。
  3. 用户继续向右滑动,此时系统显示了窗口如何缩小为主屏幕上的图标的动画。
  4. 用户现已完全返回主屏幕。

详细了解如何添加对预测性返回手势的支持

添加自定义应用内转场效果和动画

您可以创建自定义应用内属性动画和转场效果、自定义跨 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
        ) {}
    }
}