enterAnim和popEnterAnim以及exitAnim和popExitAnim之间有什么区别?

57
最新的Navigation Architecture组件中动画标签之间有什么区别?我对enterAnimpopEnterAnim感到困惑。同样,exitAnimpopExitAnim也是如此。
欢迎提供任何更好的视觉拓展。
3个回答

102

动画过渡文档详细介绍了四种类型的动画:

  • 进入目的地
  • 退出目的地
  • 通过pop 操作进入目的地
  • 通过 pop 操作退出目的地

"进入"(Entering)指该目的地即将出现在屏幕上,而 "退出"(Exiting)则是指该目的地正在离开屏幕。

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

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


1
谢谢@ianhanniballake,如果能在文档中看到这个就太棒了! - Zsolt Boldizsar
@ZsoltBoldizsár - 我已经链接到了相关文档,其中已经涵盖了这个问题。您具体缺少什么信息? - ianhanniballake
4
也许只是我自己的问题,但阅读文档时不太清楚哪个动画会影响哪个片段,文档只提到了我可以使用的类型。你的解释则清楚地说明了使用哪种动画类型来对哪个片段进行动画处理。因此我错过了文档中的示例部分。谢谢! - Zsolt Boldizsar
@ianhanniballake,如果没有你的示例,文档措辞有些难以解释。对我而言,“输入目的地”意味着A正在输入B,因为如果B是目的地,那么B就不能是参考,因为这意味着B正在输入自己,因为它本身是目的地... 如果听起来混淆了,那就是文档如此精确地解释的。 - Chapz
这应该是关于动画和导航的官方文档,位于此处:https://developer.android.com/guide/navigation/navigation-animate-transitions - Ehsan Mashhadi
把这个添加到文档里面肯定是个好主意。放在这里非常方便 https://developer.android.com/guide/navigation/navigation-animate-transitions - Vincent Paing

11

Pop与后退栈有关,我使用后退栈来帮助理解

例如:

A现在正在屏幕上显示,我们将要把B放到屏幕上,然后A将从屏幕退出(动画/事务),B进入屏幕。

现在如果您点击返回键/向上按钮会发生什么?是的,相反的情况会发生,也就是B将被A所替换。

  • B后退栈中弹出并从屏幕中退出(Pop Exit)
  • A后退栈中进入视图(Pop Enter)

1
我知道我正在回答一个三年前的问题,但是我对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。在这个例子中,我们将仅使用定义的<action>和系统返回按钮从FragmentA导航到FragmentB-> FragmentC-> Back-> Back。

因此,从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接