以编程方式在 MotionLayout 中设置边距
Programmatically set margins in a MotionLayout
我有一些视图需要以编程方式设置一些边距(来自 applyWindowInsets 侦听器),但这些视图似乎忽略了我用代码设置的任何边距,即使我没有为边距设置动画。
我可以很好地设置填充,但我无法仅使用填充来完成我需要的。
这个问题似乎与 MotionLayout 有关,因为如果它是 ConstraintLayout,它就可以正常工作。
我一直在使用这个util方法。
public static void addTopMargin(View v, int margin) {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
}
您遇到的问题是 MotionLayout
从指定的 ConstraintSets
派生其边距,因此更改基本边距实际上没有任何作用。要使其正常工作,您需要将定义 MotionScene
:
的 ConstraintSets
中的一个或两个作为目标
val motionLayout = findViewById(R.id.motionLayoutId)
motionLayout.getConstraintSet(R.id.startingConstraintSet)?
.setMargin(targetView.id, anchorId, value)
您也可以为多个视图执行此操作 let
:
val motionLayout = findViewById(R.id.motionLayoutId)
motionLayout.getConstraintSet(R.id.startingConstraintSet)?.let {
setMargin(firstView.id, anchorId, value)
setMargin(secondView.id, anchorId, value)
}
上边距,使用ConstraintSet.TOP
等
请记住,如果您不想为该边距设置动画,则必须同时分配给开始和结束 ConstraintSet
。
只需向 UnOrthodox 解决方案添加一个简单的注释,如果您不需要为该边距设置动画,您将需要通过添加 ConstraintSets 边距来保持基本边距:
public static void addTopMargin(View v, int margin) {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
MotionLayout root = findViewById(R.id.motion_layout);
root.getConstraintSet(R.id.start).setMargin(firstView.id, anchorId, margin);
root.getConstraintSet(R.id.end).setMargin(firstView.id, anchorId, margin);
}
我有一些视图需要以编程方式设置一些边距(来自 applyWindowInsets 侦听器),但这些视图似乎忽略了我用代码设置的任何边距,即使我没有为边距设置动画。
我可以很好地设置填充,但我无法仅使用填充来完成我需要的。
这个问题似乎与 MotionLayout 有关,因为如果它是 ConstraintLayout,它就可以正常工作。
我一直在使用这个util方法。
public static void addTopMargin(View v, int margin) {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
}
您遇到的问题是 MotionLayout
从指定的 ConstraintSets
派生其边距,因此更改基本边距实际上没有任何作用。要使其正常工作,您需要将定义 MotionScene
:
ConstraintSets
中的一个或两个作为目标
val motionLayout = findViewById(R.id.motionLayoutId)
motionLayout.getConstraintSet(R.id.startingConstraintSet)?
.setMargin(targetView.id, anchorId, value)
您也可以为多个视图执行此操作 let
:
val motionLayout = findViewById(R.id.motionLayoutId)
motionLayout.getConstraintSet(R.id.startingConstraintSet)?.let {
setMargin(firstView.id, anchorId, value)
setMargin(secondView.id, anchorId, value)
}
上边距,使用ConstraintSet.TOP
等
请记住,如果您不想为该边距设置动画,则必须同时分配给开始和结束 ConstraintSet
。
只需向 UnOrthodox 解决方案添加一个简单的注释,如果您不需要为该边距设置动画,您将需要通过添加 ConstraintSets 边距来保持基本边距:
public static void addTopMargin(View v, int margin) {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
MotionLayout root = findViewById(R.id.motion_layout);
root.getConstraintSet(R.id.start).setMargin(firstView.id, anchorId, margin);
root.getConstraintSet(R.id.end).setMargin(firstView.id, anchorId, margin);
}