正如@hoford所说,ConstraintSet 每次更改时都不会合并。显然,如果不使用反射,这也是不可能的,尽管它肯定很有用。无论如何,这里是如何使用反射(通过一些扩展函数)来做到这一点。
我确实创建了自己的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)
让我知道这是否有效或是否有任何错误!