我正在使用MotionLayout
,并尝试应用一系列转换(在MotionScene
文件中定义)。例如Transition1改变了View1的位置,然后Transition2随后改变了View2的位置。我看到的问题是Transition2导致View1恢复到它的原始布局。我使用对transitionToState()
的调用来触发转换(我还尝试使用setTransition()
显式地为转换提供开始/结束状态,然后调用transitionToEnd()
)。
我在https://www.raywenderlich.com/8883-motionlayout-tutorial-for-android-getting-started上看到这样的评论
如果不为视图提供结束约束,它将消失。发生这种情况是因为库不知道应该在动画结束时应用哪些约束
是否有必要在Transition2的ConstraintSet
中包含有关View1布局的信息?
在https://github.com/googlesamples/android-ConstraintLayoutExamples/blob/master/README.md中有一个“多状态”的例子,但是看起来所有包含的转换都是从单一的基础状态开始的(而不是“累积”)。
发布于 2019-03-08 06:21:43
正如@hoford所说,ConstraintSets并不是每次更改时都合并。显然,如果不使用反射,这也是不可能的,尽管它肯定会很有用。无论如何,这里是如何使用反射(通过一些扩展函数)来实现的。
我确实创建了我的own TransitionListener
基类来提供支持注释和可读值名称。扩展函数可以在here中找到。
您可以做的是合并这两个ConstraintSets
,然后修改可以通过TransitionListener#onTransitionChange
获得的endConstraintSet
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
}
}
为了不在每次调用TransitionListener#onTransitionChange
时都合并和应用ConstraintSets
,有一个简单的helper变量。
最后,您必须将监听器附加到MotionLayout
val accumulativeListener = AccumulativeTransitionListener()
motionLayout.setTransitionListener(accumulativeListener)
让我知道,如果这是工作或如果有任何错误!
发布于 2019-03-07 00:47:53
转换不是状态的增量。他们从一个州到另一个州。ConstraintSets定义了这些状态。
ConstraintSets (在MotionScene的上下文中)定义一个状态,即基本布局+标签中描述的更改。
https://stackoverflow.com/questions/55027526
复制相似问题