在目标之间动画化过渡

Navigation 组件允许您将属性动画和视图动画添加到操作中。若要创建您自己的动画,请查看 动画资源.

Navigation 还包含几个默认动画以帮助您入门。若要将动画添加到操作,请执行以下操作

  1. 在 Navigation 编辑器中,单击应执行动画的操作。
  2. 在 **属性** 面板的 **动画** 部分,单击您要添加的动画旁边的下拉箭头。您可以从以下类型中选择
    • 进入目标
    • 退出目标
    • 通过 弹出操作 进入目标,弹出操作是在导航时从返回堆栈中弹出其他目标的操作。
    • 通过弹出操作退出目标
  3. 从出现的项目动画列表中选择一个动画。
the animations section of the attributes panel
图 1. **属性** 面板的 **动画** 部分。

添加完动画后,单击 **文本** 选项卡切换到 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>

在目标之间添加共享元素过渡

当视图在两个目标之间共享时,您可以使用共享元素过渡来定义在从一个目标导航到另一个目标时视图如何过渡。共享元素过渡是 Transition Framework 的一部分。

共享元素是通过编程方式提供的,而不是通过导航 XML 文件提供的。活动和片段目标都具有 Navigator.Extras 接口的子类,该子类接受用于导航的附加选项,包括共享元素。您可以在调用 navigate() 时传递这些 Extras

共享元素过渡到片段目标

The FragmentNavigator.Extras 类允许您通过过渡名称将共享元素从一个目标映射到另一个目标,类似于使用 FragmentTransaction.addSharedElement()。然后,您可以将额外信息传递给 navigate(),如以下示例所示

Kotlin

val extras = FragmentNavigatorExtras(view1 to "hero_image")

view.findNavController().navigate(
    R.id.confirmationAction,
    null, // Bundle of args
    null, // NavOptions
    extras)

Java

FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
    .addSharedElement(view1, "hero_image")
    .build();

Navigation.findNavController(view).navigate(
    R.id.details,
    null, // Bundle of args
    null, // NavOptions
    extras);

共享元素过渡到活动目标

活动依赖于 ActivityOptionsCompat 来控制共享元素过渡,如 使用共享元素启动活动 文档中所述,以及以下示例所示

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(view1, "hero_image"))
val extras = ActivityNavigatorExtras(options)
view.findNavController().navigate(
    R.id.details,
    null, // Bundle of args
    null, // NavOptions
    extras)

Java

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
        Pair.create(view1, "hero_image"));

ActivityNavigatorExtras extras = new ActivityNavigatorExtras.Builder()
    .setActivityOptions(options)
    .build();


Navigation.findNavController(view).navigate(
    R.id.details,
    null, // Bundle of args
    null, // NavOptions
    extras);

将弹出动画应用于活动过渡

当您导航到或从 Activity 导航时,弹出动画不会自动应用。相反,您必须从目标 Activity 目标调用 ActivityNavigator.applyPopAnimationsToPendingTransition(),动画应在其中发生

Kotlin

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

Java

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