欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

在目的地之间添加动画过渡效果

借助 Navigation 组件,您可以同时向操作添加属性动画和视图动画。要创建您自己的动画,请参阅动画资源

Navigation 组件还包含几个默认动画,以帮助您快速入门。要向操作添加动画,请执行以下操作:

  1. 在 Navigation Editor 中,点击应发生动画的操作。
  2. Attributes 面板的 Animations 部分中,点击要添加的动画旁边的下拉箭头。您可以从以下类型中进行选择:
    • 进入目的地
    • 退出目的地
    • 通过弹出操作进入目的地
    • 通过弹出操作退出目的地
  3. 从显示的项目动画列表中选择动画。

添加动画后,点击 Text 标签页,以切换到 XML 文本视图。动画的 XML 现在显示在相应的 <action> 元素中。在以下示例中,specifyAmountFragmentconfirmationAction 操作的源目的地:

    <fragment
        android:id="@+id/specifyAmountFragment"
        android:name="com.example.buybuddy.buybuddy.SpecifyAmountFragment"
        android:label="fragment_specify_amount"
        tools:layout="@layout/fragment_specify_amount">
        <action
            android:id="@+id/confirmationAction"
            app:destination="@id/confirmationFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />
    </fragment>
    

在目的地之间添加共享元素过渡效果

除了过渡动画之外,Navigation 组件还支持在目的地之间添加共享元素过渡效果。共享元素过渡以编程方式提供,而不是通过您的导航 XML 文件提供,因为它们需要引用您想要添加到共享元素过渡中的 View 实例。

每种目的地类型都会通过 Navigator.Extras 接口的子类实现此程序化 API。Extras 会传递到对 navigate() 的调用。

Fragment 目的地共享元素过渡

借助 FragmentNavigator.Extras 类,您可以将共享元素附加到对 Fragment 目的地的 navigate() 调用,如以下示例所示:

Kotlin

    val extras = FragmentNavigatorExtras(
        imageView to "header_image",
        titleView to "header_title")
    view.findNavController().navigate(R.id.confirmationAction,
        null, // Bundle of args
        null, // NavOptions
        extras)
    

Java

    FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
        .addSharedElement(imageView, "header_image")
        .addSharedElement(titleView, "header_title")
        .build();
    Navigation.findNavController(view).navigate(R.id.details,
        null, // Bundle of args
        null, // NavOptions
        extras);
    

Activity 目的地共享元素过渡

Activity 依靠 ActivityOptionsCompat 来控制共享元素过渡(启动具有一个共享元素的 Activity 文档对此进行了详细介绍),如以下示例所示:

Kotlin

    // Rename the Pair class from the Android framework to avoid a name clash
    import android.util.Pair as UtilPair
    ...
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
            UtilPair.create(imageView, "header_image"),
            UtilPair.create(titleView, "header_title"))
    val extras = ActivityNavigator.Extras(options)
    view.findNavController().navigate(R.id.details,
        null, // Bundle of args
        null, // NavOptions
        extras)
    

Java

    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
            Pair.create(imageView, "header_image"),
            Pair.create(titleView, "header_title"));

    ActivityNavigator.Extras extras = new ActivityNavigator.Extras.Builder()
        .setActivityOptions(options)
        .build();
    Navigation.findNavController(view).navigate(R.id.details,
        null, // Bundle of args
        null, // NavOptions
        extras);
    

将弹出动画应用于 Activity 过渡

导航到一个 Activity 或从中导航出来时,系统不会自动应用弹出动画。相反,您必须从应发生动画的目标 Activity 的目的地调用 ActivityNavigator.applyPopAnimationsToPendingTransition()

Kotlin

    override fun finish() {
        super.finish()
        ActivityNavigator.applyPopAnimationsToPendingTransition(this)
    }
    

Java

    @Override
    public void finish() {
        super.finish();
        ActivityNavigator.applyPopAnimationsToPendingTransition(this);
    }