7

我有一些视图需要以编程方式设置一些边距(来自 applyWindowInsets 侦听器),但视图似乎忽略了我用代码设置的任何边距,即使我没有为边距设置动画。

我可以很好地设置填充,但我不能只使用填充来完成我需要的事情。

这个问题似乎与 MotionLayout 有关,因为如果它是一个 ConstraintLayout,它就可以正常工作。

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

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

2 回答 2

6

您遇到的问题是MotionLayout它的边距是从 assigned 派生的ConstraintSets,因此更改基本边距实际上并没有做任何事情。要使其正常工作,您需要针对ConstraintSets定义的一个或两个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等。

请记住,如果您不想为该边距设置动画,则必须同时指定 start 和 end ConstraintSet

于 2020-05-26T17:47:58.430 回答
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);
}
于 2021-02-28T10:55:12.613 回答