constraintlayout.widget.Group与TransitionManager一起使用时动画不起作用

7

有没有人知道为什么使用TransitionManager动画constraintlayout.widget.Group的可见性不起作用?这个小部件不是专门用来做这种事情的吗?

如果在将视图从Group中分离后隐藏或显示项,则会起作用。

        <androidx.constraintlayout.widget.Group
            android:id="@+id/cardHeadersGroup"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:visibility="invisible"
            app:constraint_referenced_ids="cardSystemHeader,cardSimpleHeader,cardCombinedHeader"
            app:layout_constraintBottom_toBottomOf="@+id/cardCombinedHeader"
            app:layout_constraintEnd_toEndOf="@+id/cardSystemHeader"
            app:layout_constraintStart_toStartOf="@+id/cardSimpleHeader"
            app:layout_constraintTop_toTopOf="parent"
            tools:visibility="visible"/>

 val headersGroup = binding.cardHeadersGroup

        val slideIn = Slide()
        slideIn.slideEdge = Gravity.BOTTOM
        slideIn.mode = Slide.MODE_IN
        slideIn.addTarget(headersGroup)

        TransitionManager.beginDelayedTransition(binding.root as ViewGroup, slideIn)

        headersGroup.visibility = VISIBLE

2个回答

8

最近我一直在使用TransitionManagerConstraintLayout.Group,但发现这两者存在很多bug。

最终,我放弃了ConstraintLayout.Group,创建了一个类似于in-xmlAnimationGroup(与ConstraintLayout.Group类似,但是在代码中实现):

class AnimationGroup(vararg val views: View) {
    var visibility: Int = View.INVISIBLE
        set(value) {
            views.forEach { it.visibility = value }
            field = value
        }
}

还有一个用于Transition的扩展函数:

private fun Transition.addTarget(animationGroup: AnimationGroup) {
    animationGroup.views.forEach { viewInGroup -> this.addTarget(viewInGroup) }
}

这样,您就可以做到以下事情(几乎完全相同的代码,但XML更简单——没有ConstraintLayout.Group):
val headersGroup = AnimationGroup(
    binding.cardSystemHeader, 
    binding.cardSimpleHeader, 
    binding.cardCombinedHeader
)

val slideIn = Slide()
slideIn.slideEdge = Gravity.BOTTOM
slideIn.mode = Slide.MODE_IN
slideIn.addTarget(headersGroup)

TransitionManager.beginDelayedTransition(binding.root as ViewGroup, slideIn)

headersGroup.visibility = VISIBLE

4
我们也可以使用简单的扩展函数提取组引用的视图:
fun Group.getReferencedViews() = referencedIds.map { rootView.findViewById<View>(it) }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接