ConstraintLayout 中居中对齐的边距行为

Margin behavior with center align in ConstraintLayout

我使用 app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" 垂直对齐子视图中心。 但是当我为我的子视图添加底部边距时,我发现它只占用了一半的边距。

例如

红色视图和蓝色视图垂直居中对齐,高度为 100dp。然后我将底部边距 (100dp) 添加到红色视图。我以为红色视图会在蓝色视图之上,但它只提高了 50dp。

发生这种情况是因为在创建视图时,首先添加边距。然后,相对于剩下的space设置位置;所以,如果你的垂直位置是 0.5(中心),你的底部边距将只占这个百分比。

该行为是预期的。让我来解释一下:

当您添加“marginBottom”时,您是在参考您的约束在 constraintBottom 中指定的内容(在本例中为父级)。

将屏幕想象成一张纸,有 x, y 轴,想象它是一个 1000 大小的正方形。 如果没有边距,由于您的限制,您的视图将以 (500, 500) 为中心,对吗?左上角位于 (450, 550),右下角位于 (550, 450)。

现在,添加边距会发生什么?

从您的角度来看,您基本上是在缩小论文的范围。由于边距,您的视图需要距离父级 100,就像您的视图一样,新屏幕参考不是大小为 1000 的正方形,而是宽度 = 1000 和高度 = 900 的矩形。

现在约束来了,好吧,把它放在这个平面的中心并做一些数学运算,你可以看到新的中心是 (500, 450),左上角在 (450, 400) 中,并且(550, 500) 中的右下角。

换句话说,由于在应用边距后您的新视图使用此新屏幕参考,因此您的边距在顶部和底部分开了一半。

那你有什么选择呢?

最好的方法是使用链,您可以将两个视图链接在一起,使它们都居中,然后在它们之间指定 space。

长话短说,与其将第一个视图限制为 bottom="parent",不如将其更改为对第二个视图的限制。对于您的第二个视图也是如此,而不是对 top="parent" 的约束,将其更改为对您的第一个视图的约束,仅此而已。

查看此参考以了解有关链的更多信息:https://developer.android.com/training/constraint-layout#constrain-chain 并了解您可以自定义它们的所有方式以及它们的工作方式:)