enterAnim & popEnterAnim & exitAnim & popExitAnim 有什么区别?

What is the difference between enterAnim & popEnterAnim & exitAnim & popExitAnim?

最新的导航架构组件中的动画标签有什么区别?我对 enterAnimpopEnterAnim 感到困惑。同样,exitAnim & popExitAnim.

我们非常欢迎任何视觉扩展。

Animate transitions between destinations documentation详细介绍了四种动画:

  • Entering a destination
  • Exiting a destination
  • Entering a destination via a pop action
  • Exiting a destination via a pop action

"Entering"指的是进入屏幕的目的地,而"exiting"指的是离开屏幕的目的地。

因此,当您从目的地 A 导航到目的地 B 时,进入目的地 B 将应用 enterAnim,而退出目的地 [=10] =] 将应用 exitAnim

当用户点击系统后退按钮时,从 B 返回 A,相反的情况发生:进入目的地 A 将应用 popEnterAnim,而退出目的地 B 将应用 popExitAnim

pop和back stack有关,我用back stack来帮助理解

例如

A 正在屏幕上显示,我们要将 B 放在屏幕上,然后 A 退出 (Anim/transaction) 从屏幕上,BEnter 到屏幕。

现在如果你点击返回 key/up 按钮会发生什么?是的,相反的情况发生了。这意味着 B 将被 A 取代。

  • B 从返回堆栈弹出 并退出屏幕(弹出 退出)
  • Aback stack进入视图(Pop Enter

我知道我在回答一个三年前的问题,但我对 enterAnimexitAnimpopEnterAnimpopExitAnim 比@ianhanniballake 接受的答案中所呈现的要多。

在我的解释中,所有四个属性都针对图中的相同目标:由给定 <action>app:destination 属性定义的目标。 enterAnimexitAnim 在以“常规方式”导航到目的地或从目的地导航时应用,而 popEnterAnim 在显示为目的地“上方”的结果时应用于目的地"它从后台弹出。同样,当 popExitAnim 从后台弹出时,它会应用于目标。

我也举个例子来说明一下。让我们假设下面的导航图:

<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/example_graph"
    app:startDestination="@id/destination_a">
    <fragment
        android:id="@+id/destination_a"
        android:name="com.example.FragmentA">
        <action
            android:id="@+id/from_a_to_b"
            app:destination="@id/destination_b"
            app:enterAnim="@anim/slide_in_bottom"
            app:exitAnim="@anim/scale_out_center"
            app:popEnterAnim="@anim/scale_in_center"
            app:popExitAnim="@anim/slide_out_bottom" />
    </fragment>
    <fragment
        android:id="@+id/destination_b"
        android:name="com.example.FragmentB">
        <action
            android:id="@+id/from_b_to_c"
            app:destination="@id/destination_c" />
    </fragment>
    <fragment
        android:id="@+id/destination_c"
        android:name="com.example.FragmentC" />
</navigation>

当我们启动目标 Activity 时,我们将查看 FragmentA。在此示例中,我们将从 FragmentA -> FragmentB -> FragmentC -> Back -> Back 导航,仅使用定义的 <action> 和系统后退按钮。

因此,从 FragmentA 导航到 FragmentB 将:

  • 使用默认动画隐藏 FragmentA
  • 使用 slide_in_bottom 动画(“enterAnim”)显示 FragmentB

进一步,从 FragmentB 导航到 FragmentC 将:

  • 使用默认动画显示 FragmentC,并且
  • 删除带有 scale_out_center 动画(“exitAnim”)的 FragmentB

在返回途中,按系统后退按钮将:

  • 使用默认动画从后台堆栈中删除 FragmentC
  • 使用 scale_in_center 动画(“popEnterAnim”)显示 FragmentB

再次按系统后退按钮将:

  • 使用 slide_out_bottom 动画(“popExitAnim”)隐藏 FragmentB
  • 使用默认动画显示 FragmentA