如何检查 MotionScene 是否处于转换 "start" 或 "end"?

How to check if MotionScene is at transition "start" or "end"?

我有一个带有 MotionScene 的 MotionLayout,我想做一个“if-check”(在 Kotlin 中)来检查场景当前是否处于过渡“开始”或“结束”。

有人知道怎么做吗?

这是我在 MotionScene 中的过渡“开始”和“结束”:

<Transition
     motion:constraintSetEnd="@+id/end"
     motion:constraintSetStart="@+id/start"
     motion:duration="1000"> 

找到了一个非常方便的MotionLayout方法可以使用,解决了我的问题

可以像这样简单地使用 MotionLayout 的 built-in 方法“进度”:

if (my_motionlayout.progress == 0.0f) {
           // The transition is at "start"
        }

您可以根据需要使用 TransitionListener 回调

motionLayout.setTransitionListener(new MotionLayout.TransitionListener() {
        @Override
        public void onTransitionStarted(MotionLayout motionLayout, int i, int i1) {
            Log.i(TAG, "onTransitionStarted: ");
        }

        @Override
        public void onTransitionChange(MotionLayout motionLayout, int i, int i1, float v) {
            if (isViewVisible) {
                hideViews();
            }
        }
        @Override
        public void onTransitionCompleted(MotionLayout motionLayout, int i) {
            if (i != R.layout.start) {
                showViews();
            }
        }


        @Override
        public void onTransitionTrigger(MotionLayout motionLayout, int i, boolean b, float v) {


        }
    });

你也可以使用motionLayout.getProgress()
onTransitionChange 内,每当抽屉的位置发生变化时调用。

像这样

 public void onTransitionChange(MotionLayout motionLayout, int i, boolean b, float v) {
            if (motionLayout.getProgress() == 0.0) {
              // this is start 
            } else {
                // this is end 
            }
        }

而不是使用

motionLayout.progress == 0.0f

你可以使用

motionLayout.currentState == R.id.XXXX

并将 XXXX 更改为您想要的状态,第一个状态使用如下所述的开始

motionLayout.setTransitionListener(object : MotionLayout.TransitionListener {
        override fun onTransitionCompleted(motionLayout: MotionLayout?, currentId: Int) {
            if (motionLayout != null) {
                if (motionLayout.currentState == R.id.start) {

                    // PUT YOUR CODE HERE

                }
            }
        }

        override fun onTransitionTrigger(motionLayout: MotionLayout?, triggerId: Int, positive: Boolean, progress: Float) {}
        override fun onTransitionStarted(motionLayout: MotionLayout?, startId: Int, endId: Int) {}
        override fun onTransitionChange(motionLayout: MotionLayout?, startId: Int, endId: Int, progress: Float) {}
    })