如何保证安卓系统中碎片过渡动画的绘制顺序



我正在使用片段转换动画。我没有将XML文件用于动画。我已经将Transition子类化了。两个动画都播放得很好,但传出片段的动画绘制在传入片段的动画上。我想让传出片段的动画绘制在传入片段的动画后面。我使用androidx.fragment.app.FragmentContainerView作为碎片的容器。

参考编号:https://developer.android.com/reference/androidx/fragment/app/FragmentContainerView

这份文件上写着

使用退出动画的片段在所有其他片段之前绘制FragmentContainerView。这样可以确保退出的碎片不会显示在视图顶部。

我正在调用supportFragmentManager.beginTransaction()中的.replace(...)

安卓框架中有一个长期运行的错误,它在进入转换下面设置了退出转换动画。这是由于过渡在ViewOverlay上绘制其动画值来扩展可见性。

你可以在这里看到Android票证:https://issuetracker.google.com/issues/37036000

我通过使用enterTransition将传出视图捕获为位图,然后自己操作它来解决这个问题。下面你可以看到我对Hold((转换的替代实现:

exitTransition = HoldBackground(resources).setDuration(duration)
enterTransition = Slide(Gravity.RIGHT).addTarget(R.id.container).setDuration(duration)
class HoldBackground(val resources : Resources) : Transition() {
init {
duration = resources.getInteger(android.R.integer.config_mediumAnimTime).toLong()
}
var inProgress = false
@Synchronized
override fun captureStartValues(transitionValues: TransitionValues) {
if(inProgress) return
transitionValues.view.also { exitingView ->
exitingView.parent.also { fragmentContainer ->
if(fragmentContainer is View && exitingView.width > 0 && exitingView.height > 0) {
inProgress = true
val previousBackground = fragmentContainer.background
val bitmap = Bitmap.createBitmap(
exitingView.width,
exitingView.height,
Bitmap.Config.ARGB_8888
)
exitingView.draw(Canvas(bitmap))
fragmentContainer.background = BitmapDrawable(resources, bitmap)
// Simple animator so timing matches developer animation scales
val animator = ValueAnimator.ofInt(0, 1).setDuration(duration)
animator.addListener(object : BlankAnimatorListener() {
override fun onAnimationEnd(animation: Animator?) {
fragmentContainer.background = previousBackground
inProgress = false
}
})
animator.start()
}
}
}
}
override fun captureEndValues(transitionValues: TransitionValues) {}
}

我很想找到另一种方法,因为这根本没有效率。如果你发现什么,请告诉我。

最新更新