【问题标题】:constraintlayout.widget.Group animation not working with TransitionManagerconstraintlayout.widget.Group 动画不适用于 TransitionManager
【发布时间】:2023-04-01 09:22:01
【问题描述】:

有谁知道为什么使用 TransitionManager 为 constraintlayout.widget.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

【问题讨论】:

    标签: android android-animation android-constraintlayout


    【解决方案1】:

    我最近一直在与TransitionManagerConstraintLayout.Group 合作,发现它非常有问题。

    最终我决定转储整个ConstraintLayout.Group 并创建了一个代码内AnimationGroup(类似于in-xml 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
    

    【讨论】:

      【解决方案2】:

      我们还可以通过简单的扩展函数提取Group的引用视图:

      fun Group.getReferencedViews() = referencedIds.map { rootView.findViewById<View>(it) }
      

      【讨论】:

        猜你喜欢
        • 2021-05-31
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2016-02-22
        相关资源
        最近更新 更多