25

我正在使用支持库。现在,我想让一个片段从底部移入,移过前一个片段。

为此,我使用它来保持前一个片段(正在滑过的片段)可见,直到新片段就位:

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromAlpha="1.0" android:toAlpha="1.0" 
   android:duration="2500"
   android:zAdjustment="bottom" />

这是用于新片段从底部滑入的动画:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p" android:toYDelta="0"
        android:duration="@android:integer/config_mediumAnimTime" 
        android:zAdjustment="top"/>

我已将 z 调整设置为底部和顶部,但“底部”动画仍位于新片段的顶部!我已将持续时间设置为 2500 进行测试,并且它一直保持在顶部。

zAdjustment 不适用于片段动画吗?

4

4 回答 4

9

根据这个google group thread Z 调整仅适用于窗口动画。

“Z 调整仅适用于窗口动画。我认为这已记录在案,但显然没有。” -- Dianne Hackborn(Android 框架工程师)

于 2012-09-07T08:08:27.477 回答
6

您可以覆盖该onCreateAnimation方法,并且对于任何动画,您可以检查当前正在运行的动画,如果您需要它位于顶部,请从那里设置 Z 轴。

override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
    if (nextAnim == R.anim.enter_from_right || nextAnim == R.anim.exit_to_right) {
        ViewCompat.setTranslationZ(view, 1f)
    } else {
        ViewCompat.setTranslationZ(view, 0f)
    }

    return super.onCreateAnimation(transit, enter, nextAnim)
}

建议将此实现为所有片段的基本片段类。

于 2018-05-10T09:48:58.607 回答
4

我也被这个问题困住了。因此,transaction.replace(containerId, newFragment)我没有使用,而是为片段创建了两个容器,现在我的代码看起来像这样

添加第一个片段:

transaction.add(containerId1, firstFragment).commit();

在第一个片段上添加带有动画的第二个片段:

findViewById(containerId2).bringToFront();
transaction.setCustomAnimations(R.anim.slide_in_up,
 R.anim.stay).remove(oldFragment).add(containerId2, newFragment).commit()
于 2015-06-09T11:39:58.293 回答
0

您可以androidx.fragment.app.FragmentContainerView用作片段容器。它会自动处理指定动画的 z 顺序setCustomAnimations()

于 2021-09-15T04:48:06.870 回答