片段,android:zAdjustment(z order)和动画

时间:2012-08-28 08:55:54

标签: android-fragments android-animation

我正在使用支持库。现在,我希望从底部移动一个片段,移动到前一个片段。

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

<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不适用于片段动画吗?

3 个答案:

答案 0 :(得分:9)

根据this谷歌组线程Z调整仅适用于窗口动画。

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

答案 1 :(得分:5)

您可以覆盖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)
}

建议将其作为所有片段的基础Fragment类实现。

答案 2 :(得分: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()