添加对内置和自定义预测性返回动画的支持

如果您已将应用迁移到新的系统返回 API,则可以选择启用预测性返回,以自动接收应用内动画并支持自定义转换。

添加对内置应用内动画的支持

视频:预测性返回动画

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

您还可将 Material 组件依赖项升级到 v1.10.0 的 MDC Android,以接收 Material 组件动画,比如:

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

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

详细了解如何支持预测性返回

添加自定义应用内转换和动画

借助 Android 14,您可为应用的自定义时刻创建自定义应用内转换和动画。

使用一组预测性返回进度 API 开发自定义的应用内转换和动画。

在 AndroidX Activity 1.8.0-alpha01 或更高版本中,您可向应用中的预测性返回手势添加自定义转换效果。在 OnBackPressedCallback 中,我们引入了 handleOnBackProgressedhandleOnBackCancelledhandleOnBackStarted 方法,以便在用户向下滑动时为对象添加动画效果。如果您需要实现的效果在自定义程度上超过了新系统动画或 Material 组件动画提供的默认动画,请使用这些方法。

以下模拟显示了使用 OnBackPressedCallback 实现的自定义动画(在本例中是一个简单的框)。在模拟中,该框会缩小并沿滑动方向移动。

以下示例说明了如何实现此功能。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val box = findViewById<View>(R.id.box)
        val screenWidth = Resources.getSystem().displayMetrics.widthPixels
        val maxXShift = (screenWidth / 20)

        // For the purposes of demonstration, this code snippet presents the
        // callback as being always enabled. However, in practice it's always a
        // good idea to always disable the callback when you're ready for the
        // system to handle back events.
        val callback = object : OnBackPressedCallback(enabled = true) {

            override fun handleOnBackProgressed(backEvent: BackEvent) {
                when (backEvent.swipeEdge) {
                    BackEvent.EDGE_LEFT ->
                        box.translationX = backEvent.progress * maxXShift
                    BackEvent.EDGE_RIGHT ->
                        box.translationX = -(backEvent.progress * maxXShift)
                }
                box.scaleX = 1F - (0.1F * backEvent.progress)
                box.scaleY = 1F - (0.1F * backEvent.progress)
            }

            override fun handleOnBackPressed() {
                // Do something after the back gesture completes.
            }

            override fun handleOnBackCancelled() {
                // e.g. reset box to the original position
            }
        }
        this.onBackPressedDispatcher.addCallback(callback)
    }
}

我们希望大多数应用都使用向后兼容的 AndroidX API,但 OnBackAnimationCallback 中也有类似的平台 API 可用于在 Android 14 开发者预览版 1 及更高版本中进行测试。

在 Android 14 及更高版本上添加自定义 activity 转换

为确保自定义 activity 转换在 Android 14 及更高版本上支持预测性返回,您可以使用 overrideActivityTransition 而非 overridePendingTransition。这意味着,转换效果会在用户滑回时播放。

举个例子,假设在返回堆栈中 activity B 位于 activity A 之上。您可使用以下方式处理自定义 activity 动画:

  • 在 activity B 的 onCreate 方法中调用开始/结束转换效果。
  • 当用户导航到 activity B 时,使用 OVERRIDE_TRANSITION_OPEN。当用户滑回 activity A 时,使用 OVERRIDE_TRANSITION_CLOSE
  • 指定 OVERRIDE_TRANSITION_CLOSE 时,enterAnim 是 activity A 的进入动画,而 exitAnim 是 activity B 的退出动画。