我正在使用支持库。现在,我希望从底部移动一个片段,移动到前一个片段。
为此我使用它来保持前一个片段(被滑过的片段)可见,直到新片段到位:
<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不适用于片段动画吗?
答案 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()