首页 > 解决方案 > 使用 Android 导航组件动画片段过渡时 Z-Index 冲突

问题描述

我正在尝试使用Android Navigation而不是片段事务。然而,有一个问题开始变得麻烦。在为新片段使用滑入式动画时,Enter Animation将位于当前片段下方。请务必查看以下视频以查看运行中的错误。
https://youtu.be/gFnXiEyiypM

该错误似乎不是来自Navigation组件,尽管针对此特定问题引入的 hacky 解决方案(thisthis)似乎在Navigation使用时无法修复它。
在官方修复发布之前没有解决方法吗?

标签: androidandroid-fragmentsandroid-transitionsandroid-navigationandroid-architecture-navigation

解决方案


在 Google 发布官方修复程序之前,此问题有一个 hacky 修复程序。onCreateAnimation解决方案是使用以下代码 覆盖:

class BaseFragment : Fragment() {

    override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
        if (nextAnim == R.anim.fragment_enter) {
            val nextAnimation = AnimationUtils.loadAnimation(context, nextAnim)
            nextAnimation.setAnimationListener(object : Animation.AnimationListener {
                private var startZ = 0f
                override fun onAnimationStart(animation: Animation) {
                    view?.apply {
                        startZ = ViewCompat.getTranslationZ(this)
                        ViewCompat.setTranslationZ(this, 10f)
                    }
                }

                override fun onAnimationEnd(animation: Animation) {
                    // Short delay required to prevent flicker since other Fragment wasn't removed just yet.
                    view?.apply {
                        this.postDelayed({ ViewCompat.setTranslationZ(this, startZ) }, 100)
                    }
                }

                override fun onAnimationRepeat(animation: Animation) {}
            })
            return nextAnimation
        } else {
            return null
        }
    }
}

推荐阅读