enterAnim & popEnterAnim & exitAnim & popExitAnim 有什么区别?
What is the difference between enterAnim & popEnterAnim & exitAnim & popExitAnim?
最新的导航架构组件中的动画标签有什么区别?我对 enterAnim
和 popEnterAnim
感到困惑。同样,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) 从屏幕上,B
将 Enter 到屏幕。
现在如果你点击返回 key/up 按钮会发生什么?是的,相反的情况发生了。这意味着 B
将被 A
取代。
B
从返回堆栈弹出 并退出屏幕(弹出
退出)
A
从back stack进入视图(Pop Enter)
我知道我在回答一个三年前的问题,但我对 enterAnim
、exitAnim
、popEnterAnim
和 popExitAnim
比@ianhanniballake 接受的答案中所呈现的要多。
在我的解释中,所有四个属性都针对图中的相同目标:由给定 <action>
的 app:destination
属性定义的目标。 enterAnim
和 exitAnim
在以“常规方式”导航到目的地或从目的地导航时应用,而 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
最新的导航架构组件中的动画标签有什么区别?我对 enterAnim
和 popEnterAnim
感到困惑。同样,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) 从屏幕上,B
将 Enter 到屏幕。
现在如果你点击返回 key/up 按钮会发生什么?是的,相反的情况发生了。这意味着 B
将被 A
取代。
B
从返回堆栈弹出 并退出屏幕(弹出 退出)A
从back stack进入视图(Pop Enter)
我知道我在回答一个三年前的问题,但我对 enterAnim
、exitAnim
、popEnterAnim
和 popExitAnim
比@ianhanniballake 接受的答案中所呈现的要多。
在我的解释中,所有四个属性都针对图中的相同目标:由给定 <action>
的 app:destination
属性定义的目标。 enterAnim
和 exitAnim
在以“常规方式”导航到目的地或从目的地导航时应用,而 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