首页 > 解决方案 > 我可以从 MotionLayout 获得约束集吗?它使用布局而不是在场景中创建约束集

问题描述

  1. 我将 MotionLayout 用于动画视图 1。
  2. 我想以编程方式将约束 view1 更改为 view2。
  3. 我想在我的场景中使用不同的布局而不是使用 ConstrainsSet

所以我有:

res/xml/activity_scene.xml

 <Transition
    android:id="@+id/transition1"
    motion:constraintSetStart="@layout/activity_state1"
    motion:constraintSetEnd="@layout/activity_state2">

    // <..>
</Transition>

资源/布局/activity_state1.xml

<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motionLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/activity_scene"> 

// viev1 is small and view1 at left

/>

资源/布局/activity_state2.xml

<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motionLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/activity_scene"> 

// viev1 is big and view1 at center

/>

现在我想从activity_state1更改我的view1的约束(从左到右更改屏幕上的开始位置)。

因此,我知道如何更改约束,请参阅下面的代码:

MainActivity.kt

  fun changeConstraint() {
        motionLayout.getConstraintSet(**????**)?.let {
            it.clear(R.id.img)
            it.connect(R.id.view1, ConstraintSet.START, R.id.place2, ConstraintSet.START, 0)
            it.connect(R.id.view1, ConstraintSet.TOP, R.id.place2, ConstraintSet.TOP, 0)
        }
        motionLayout.requestLayout()
    }

我尝试使用另一种改变约束位置的方法。我尝试使用motionLayout.applyTo()约束和使用,并更改view1的layoutParams。另外,我尝试更改 view1 的 XY。Unforchenetly,它对我来说不能正常工作。因为 MotionLayout 不会改变动画的轨迹。或者没有任何变化。

因此,我应该将 ID 设置为 constraintSet 以便从 MainActivity 中找到它。而且我想在我的场景中使用不同的布局,而不是将带有 id 的 ConstraintSet 声明到场景中,因为场景不能以视觉方式呈现布局。

2个问题;

  1. 你知道如何获取我的activity_state1.xml的约束集吗
  2. 你知道在 MotionLayout 中改变起始位置的另一种方法吗?

标签: androidandroid-constraintlayoutandroid-motionlayout

解决方案


附加到窗口后,MotionLayout 处理 motionScene 文件并创建一系列 ConstraintSet 对象(请参阅ConstraintSet)。

您可以查询 MotionLayout 中包含的 ConstraintSet。获取它们,更新值并使用它们更新 MotionLayout。

 cs =  motionLayout.getConstraintSet(id);
 cs.change Stuf()
 motionLayout.updateState(id, cs);
 motionLayout.rebuildScene();

如果该状态在屏幕上,您可以为 2.1 中的更改设置动画。

 cs = motionLayout.getConstraintSet(id);
 cs.change_stuff_on_screen()
 motionLayout.updateStateAnimate(id, cs);
  

推荐阅读