android - 我可以从 MotionLayout 获得约束集吗?它使用布局而不是在场景中创建约束集
问题描述
- 我将 MotionLayout 用于动画视图 1。
- 我想以编程方式将约束 view1 更改为 view2。
- 我想在我的场景中使用不同的布局而不是使用 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个问题;
- 你知道如何获取我的activity_state1.xml的约束集吗
- 你知道在 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);
推荐阅读
- javascript - 如何调试 Ngrok 不通过节点模块启动?
- android - 图像选择器未调用 ActivityResultCallback
- javascript - 如何在 DefinePlugin 中访问 webpack 统计信息
- file - 比较两个文件和两个文件的输出差异(包括行号和内容)
- scala - 在 Spark conf json 文件中应用谓词下推
- powerbi - DAX - 在同一列上过滤唯一值
- python - GridSearchCV - TypeError:返回的 best_index_ 不是整数
- r - 执行 R 中 CAT 语句中的语句
- powerbi - PowerBI 模型发票 - 订单 - 客户
- r - R - 函数 F(x) 的导数