首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MotionLayout:多个累积转换

MotionLayout:多个累积转换
EN

Stack Overflow用户
提问于 2019-03-07 00:10:31
回答 2查看 2.6K关注 0票数 1

我正在使用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中有一个“多状态”的例子,但是看起来所有包含的转换都是从单一的基础状态开始的(而不是“累积”)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)

让我知道,如果这是工作或如果有任何错误!

票数 2
EN

Stack Overflow用户

发布于 2019-03-07 00:47:53

转换不是状态的增量。他们从一个州到另一个州。ConstraintSets定义了这些状态。

ConstraintSets (在MotionScene的上下文中)定义一个状态,即基本布局+标签中描述的更改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55027526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档