负边距演示:
场景
通过为其中一个视图设置负边距来重叠视图,以便它侵入另一个视图的边界框。
想法
如果应该重叠布局,它似乎可以按照您期望的方式工作。但我不想因为在不知不觉中做错事而遇到更大的问题。仿真器,物理设备,你的名字,当你使用负边距时,一切似乎都正常工作,一个视图侵入另一个视图边界框,并且取决于它在布局中的声明方式,它将位于另一个视图的上方或下方。
我也知道,从 API 21 开始,我们可以设置 translationZ
和 elevation
属性以使视图出现在其他视图之上或之下,但 我的担忧 主要来自 于在文档中 对于 layout_margin
属性,它明确指定 边距值应该为正,让我引用:
摘抄:
指定此视图左侧、顶部、右侧和底部的额外空间。这个空间在这个视图的范围之外。 边距值应该是正数。必须是维度值,是一个浮点数加上一个单位,如“14.5sp”。可用单位有:px(像素)、dp(与密度无关的像素)、sp(基于首选字体大小的缩放像素)、in(英寸)、mm(毫米)…
自从最初提出这个问题以来的几年里,我没有遇到任何负边距问题,确实尽量避免使用它们,但 没有 遇到任何问题,所以即使文档说明,我也不是担心它。
原文由 Juan Cortés 发布,翻译遵循 CC BY-SA 4.0 许可协议
2010 年,@RomainGuy(核心 Android 工程师)表示 负边距具有未指明的行为。
2011 年,@RomainGuy 表示 您可以在
LinearLayout
和RelativeLayout
上使用负边距。2016 年,@RomainGuy 表示 他们从未得到官方支持,也不会被
ConstraintLayout
支持。2020 年 12 月(v2.1.0,2021 年 6 月正式发布), ConstraintLayout 增加了对约束 的负边距支持。
不过,解决这个限制很容易。
在基本视图的底部添加一个辅助视图(高度 0dp,宽度限制为父视图),在底部添加所需的边距。
然后将您的视图置于此视图下方,有效地使其具有“负”边距,但不必使用任何不受支持的负值。