问题描述
要用另一个片段替换我正在使用setCustomAnimations()
,并在输入资源中使用以下幻灯片:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%p"
android:toXDelta="0"/>
</set>
以及以下滑出出口资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0"
android:toXDelta="-50%p"/>
</set>
但是,这无法正常工作。退出屏幕的片段将播放其50%的翻译动画,但是进入的片段不会移动100%,它会随着片段的流出而移动50%,然后在动画结束时跳到100%。
如果我将两个位移都设为100%,则动画效果很好,但是我想让滑出片段仅占50%,以在启动活动时模拟相同的视觉效果,而活动则完全滑入,但只有50%以前的活动会滑出。
是否有另一种方法可以使新片段滑入以显示在片段上方 ,从而使它们的动画不会相互冲突?
解决方法
滑入/滑出动画可以正确播放,但是Android很难确定应该在另一个片段上绘制哪个片段。在这种特殊情况下,滑出的片段仍会呈现在即将进入的片段之上,因此,只有在整个动画完成后,新的片段才完全可见。
要解决此问题,可以在播放动画时在“片段”中覆盖此方法以更改高程:
override fun onCreateAnimation(transit: Int,enter: Boolean,nextAnim: Int): Animation? {
when (nextAnim) {
R.anim.slide_out_left -> {
view?.elevation = -10f
}
R.anim.slide_in_left -> {
view?.elevation = -10f
}
else -> discard()
}
return super.onCreateAnimation(transit,enter,nextAnim)
}
这将使 old 片段被绘制在新的下方中,并且不会出现图形故障。
onCreateAnimation()
方法也是使片段变暗的好地方,尽管它们都具有相同的颜色,这有助于从视觉上将其与新片段区分开。