【问题标题】:Can I get constraintSet from MotionLayout which use a layout's instead creating constraintSet into scene我可以从 MotionLayout 获得约束集吗?它使用布局而不是在场景中创建约束集
【发布时间】:2021-06-27 12:55:58
【问题描述】:
  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>

res/layout/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

/>

res/layout/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 中改变起始位置的另一种方法吗?

【问题讨论】:

    标签: android android-constraintlayout android-motionlayout


    【解决方案1】:

    在附加到窗口后,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);
      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-04
      • 2017-02-02
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多