导航组件允许您将属性和视图动画都添加到操作中。要创建您自己的动画,请查看动画资源。
导航还包含一些默认动画来帮助您入门。要将动画添加到操作中,请执行以下操作
- 在导航编辑器中,单击应发生动画的操作。
- 在属性面板的动画部分,单击要添加的动画旁边的下拉箭头。您可以从以下类型中选择
- 进入目标
- 退出目标
- 通过返回操作进入目标,返回操作是在导航时从返回堆栈中弹出其他目标的操作。
- 通过返回操作退出目标
- 从出现的项目动画列表中选择一个动画。
添加动画后,单击文本选项卡以切换到 XML 文本视图。动画的 XML 现在显示在相应的<action>
元素中。在以下示例中,specifyAmountFragment
是confirmationAction
操作的源目标
<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>
在目标之间添加共享元素过渡
当一个视图在两个目标之间共享时,您可以使用共享元素过渡来定义在从一个目标导航到另一个目标时视图如何过渡。共享元素过渡是过渡框架的一部分。
共享元素以编程方式提供,而不是通过您的导航 XML 文件。活动和片段目标都具有Navigator.Extras
接口的子类,该接口接受导航的其他选项,包括共享元素。您可以在调用navigate()
时传递这些Extras
。
到片段目标的共享元素过渡
通过其过渡名称,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); }