片段,机器人:zAdjustment(Z顺序)和动画(fragments, android:zAdj

2019-07-31 05:54发布

我使用的支持库。 现在,我想有一个片段从底部转移,移动比前一个。

为此,我用它来保持现有的片段(正被滑动过一个)可见,直到新的片段是在它的地方:

<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不是片段动画工作?

Answer 1:

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

“Z调整只适用于窗口动画。我认为这是记录在案,但显然不是。” - 黛安娜Hackborn(Android框架工程师)



Answer 2:

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

建议实施此为您所有的片段一个片段基类。



Answer 3:

我也卡住了这一问题。 因此,而不是使用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()


文章来源: fragments, android:zAdjustment (z order) and animations