如何将前一个片段仅滑出50%或25%,而又不进行图形切割?

问题描述

要用另一个片段替换我正在使用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()方法也是使片段变暗的好地方,尽管它们都具有相同的颜色,这有助于从视觉上将其与新片段区分开。