Android MotionLayout以编程方式创建过渡

Android MotionLayout以编程方式创建过渡,android,android-constraintlayout,android-motionlayout,Android,Android Constraintlayout,Android Motionlayout,我创建了一个简单的MotionLayout,它看起来像一个自定义的BottomNavigationView 我正在使用MotionLayout为“选择器”设置动画。所以想象一下这个看起来像底部栏的视图,里面有4个“选项卡视图”和一个选择器 我试图做的是以编程方式创建Transition,因为视图是自定义的,您可以设置不同的ID、选项卡数等 但首先,我制作了一个XML版本,看看它是否真的有效,这是一个XML示例“ 之后,当用户单击选项卡时,我以编程方式运行动画。 据我所见,动画是有效的,但唯一的动

我创建了一个简单的
MotionLayout
,它看起来像一个自定义的
BottomNavigationView

我正在使用MotionLayout为“选择器”设置动画。所以想象一下这个看起来像底部栏的视图,里面有4个“选项卡视图”和一个选择器

我试图做的是以编程方式创建
Transition
,因为视图是自定义的,您可以设置不同的ID、选项卡数等

但首先,我制作了一个XML版本,看看它是否真的有效,这是一个XML示例“

之后,当用户单击
选项卡时,我以编程方式运行动画。
据我所见,动画是有效的,但唯一的动画是选择器的颜色。选择器本身应该从原来的位置(fromTab)移动到选中的选项卡。

因此,看起来
约束
没有动画,我也不知道为什么。

在创建
约束集之前,确保动态创建的选项卡已添加到布局中,并且在布局中具有测量的大小/位置

<ConstraintSet android:id="@+id/startFromFirstTabToSecondTab">
        <Constraint
            android:id="@+id/selector"
            android:layout_width="48dp"
            android:layout_height="36dp"
            motion:layout_constraintBottom_toBottomOf="@+id/tabFirst"
            motion:layout_constraintEnd_toEndOf="@+id/tabFirst"
            motion:layout_constraintStart_toStartOf="@+id/tabFirst"
            motion:layout_constraintTop_toTopOf="@+id/tabFirst">
            <CustomAttribute
                motion:attributeName="ColorFilter"
                motion:customColorValue="@color/blue" />

           <CustomAttribute
                ...

        </Constraint>
    </ConstraintSet>

    <ConstraintSet android:id="@+id/endFromFirstTabToSecond">
        <Constraint
            android:id="@+id/selector"
            android:layout_width="48dp"
            android:layout_height="36dp"
            motion:layout_constraintBottom_toBottomOf="@+id/tabSecond"
            motion:layout_constraintEnd_toEndOf="@+id/tabSecond"
            motion:layout_constraintStart_toStartOf="@+id/tabSecond"
            motion:layout_constraintTop_toTopOf="@+id/tabSecond">
            <CustomAttribute
                motion:attributeName="ColorFilter"
                motion:customColorValue="@color/purple" />

             <CustomAttribute
                ...
        </Constraint>
    </ConstraintSet>
private fun createAndSetTransition(fromTab: Tab, toTab: Tab): Int {

        val startSetId = View.generateViewId()
        val startSet = ConstraintSet()
        startSet.clone(this)
        startSet.clear(selectorId)
        startSet.connect(selectorId, ConstraintSet.START, fromTab.id, ConstraintSet.START)
        startSet.connect(selectorId, ConstraintSet.END, fromTab.id, ConstraintSet.END)
        startSet.connect(selectorId, ConstraintSet.TOP, fromTab.id, ConstraintSet.TOP)
        startSet.connect(selectorId, ConstraintSet.BOTTOM, fromTabI.id, ConstraintSet.BOTTOM)
        startSet.setColorValue(selectorId, "ColorFilter", ContextCompat.getColor(context, fromTab.color))
        startSet.apply {
            constrainWidth(selectorId, selectorWidth)
            constrainHeight(selectorId, selectorHeight)
        }

        val endSetId = View.generateViewId()
        val endSet = ConstraintSet()
        endSet.clone(this)
        endSet.clear(selectorId)
        endSet.connect(selectorId, ConstraintSet.START, toTab.id, ConstraintSet.START)
        endSet.connect(selectorId, ConstraintSet.END, toTab.id, ConstraintSet.END)
        endSet.connect(selectorId, ConstraintSet.TOP, toTab.id, ConstraintSet.TOP)
        endSet.connect(selectorId, ConstraintSet.BOTTOM, toTab.id, ConstraintSet.BOTTOM)
        endSet.setColorValue(selectorId, "ColorFilter", ContextCompat.getColor(context, toTab.color))
        endSet.apply {
            constrainWidth(selectorId, selectorWidth)
            constrainHeight(selectorId, selectorHeight)
        }

        val transitionId = View.generateViewId()
        val transition = TransitionBuilder.buildTransition(
                motionScene,
                transitionId,
                startSetId, startSet,
                endSetId, endSet)

        motionScene.addTransition(transition)

        return transitionId
    }