constraintlayout.widget.Group анимация не работает с TransitionManager - PullRequest
0 голосов
/ 26 июня 2019

Кто-нибудь знает, почему не работает анимация видимости constraintlayout.widget.Group с TransitionManager?Разве этот виджет не предназначен для такого рода вещей?

Работает, если скрывает или показывает элементы после отделения представлений от группы

        <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

1 Ответ

1 голос
/ 02 июля 2019

Я недавно работал с TransitionManager и ConstraintLayout.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
...