在MotionLayout中以编程方式设置边距

时间:2019-06-03 14:54:13

标签: android android-motionlayout

我有一些视图需要通过编程设置一些边距(通过applyWindowInsets侦听器),但是这些视图似乎忽略了我在代码中设置的任何边距,即使我没有设置边距动画。

我可以很好地设置padding,但是仅使用padding不能满足我的需要。

该问题似乎与MotionLayout有关,因为如果它是ConstraintLayout,则可以正常工作。

我一直在使用这种util方法。

public static void addTopMargin(View v, int margin) {
    ((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
}

2 个答案:

答案 0 :(得分:4)

您遇到的问题是MotionLayout从分配的ConstraintSets得出其边距,因此更改基本边距实际上无济于事。要使其正常工作,您需要定位定义ConstraintSets的{​​{1}}中的一个或两个:

MotionScene

您还可以使用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的开始和结束。

答案 1 :(得分:0)

只需向 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);
}