3

使用MotionLayout,我需要暂时转换到加载状态( ConstraintSet),我通过调用:

motionLayout.transitionToState(R.id.state_loading)

然后我想转换回我的XMLTransition中声明的默认值:MotionScene

motionLayout.transitionToState(R.id.state_expanded)

当我想通过设置endState调用来恢复默认行为时,问题就来了:

motionLayout.setTransition(R.id.state_expanded, R.id.state_collapsed)

这里的问题是setTransition(int beginId, int endId)也调用transitionToStart(), 以一种奇怪的方式再次对其进行动画处理。

所以我的问题是,是否有任何方法可以在不打电话的setTransition()情况下打电话transitionToStart()

4

1 回答 1

1

我通过创建一个自定义的方法找到了一种丑陋的方法MotionLayout,只是为了使setTransition(Transition transition)方法公开(因为它是protected但它不会调用transitionToStart()):

class CustomMotionLayout : MotionLayout {

    constructor(context: Context) : super(context)

    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)

    public override fun setTransition(transition: MotionScene.Transition) {
        super.setTransition(transition)
    }
}

然后通过 Id 检索您Transition的并将其传递给新的公共方法:

val desiredTransition = customMotionLayout.getTransition(R.id.transition_default)
customMotionLayout.setTransition(desiredTransition)

这样,当以Transition编程方式将 a 设置为 a时MotionLayout,它不会调用transitionToStart().

于 2019-07-12T14:05:55.217 回答