Как сказал @ hoford , наборы ограничений не объединяются при каждом изменении.По-видимому, это также невозможно без использования отражения, хотя, безусловно, было бы полезно.В любом случае, вот как это сделать, используя отражение (с помощью нескольких функций расширения).
Я создал свой собственный TransitionListener
базовый класс для предоставления аннотаций поддержки и имен читаемых значений.Функции расширения можно найти здесь .
. Вы можете объединить два ConstraintSets
, а затем мутировать endConstraintSet
, который можно получить с помощью TransitionListener#onTransitionChange
:
class AccumulativeTransitionListener: TransitionListener() {
var didApplyConstraintSet = false
override fun onTransitionChange(view: MotionLayout, @IdRes startConstraintSetId: Int, @IdRes endConstraintSetId: Int, progress: Float) {
if (!didApplyConstraintSet) {
// Let's retrieve our ConstraintSets first
val startConstraintSet = view.getConstraintSet(startConstraintSetId)
val endConstraintSet = view.getConstraintSet(endConstraintSetId)
// Merge them (using an extension function)
val mergedConstraintSet = startConstraintSet + endConstraintSet
// Clear + Set them
endConstraintSet.setConstraints(mergedConstraintSet)
didApplyConstraintSet = true
}
}
override fun onTransitionCompleted(view: MotionLayout, @IdRes constraintSetId: Int) {
didApplyConstraintSet = false
}
}
Чтобы не объединять и не применять ConstraintSets
каждый раз, когда вызывается TransitionListener#onTransitionChange
, существует простая вспомогательная переменная.
Наконец, вы должны присоединить слушателя к вашему MotionLayout
:
val accumulativeListener = AccumulativeTransitionListener()
motionLayout.setTransitionListener(accumulativeListener)
Дайте мне знать, если это работает или есть ошибки!