130

负边距演示:

                         在此处输入图像描述

场景

通过为其中一个视图设置负边距来重叠视图,以便它侵入另一个视图的边界框。

想法

如果应该重叠布局,它似乎可以按照您期望的方式工作。但我不想因为在不知不觉中做错事而遇到更大的问题。模拟器,物理设备,你的名字,当你使用负边距时,一切似乎都正常工作,一个视图侵入另一个视图边界框,并且取决于它在布局中的声明方式,它将位于另一个视图的上方或下方。

我也知道,从 API 21 开始,我们可以设置translationZandelevation 属性以使视图出现在其他视图之上或之下,但我的担忧基本上来自这样一个事实,即在属性的文档layout_margin明确指定边距值应该是正的,让我引用:

摘录:
指定此视图的左侧、顶部、右侧和底部的额外空间。这个空间在这个视图的范围之外。边距值应该是正数。必须是维度值,是一个浮点数加上一个单位,如“14.5sp”。可用单位有:px(像素)、dp(与密度无关的像素)、sp(基于首选字体大小的缩放像素)、in(英寸)、mm(毫米)...

自从最初提出这个问题以来的几年里,我没有遇到任何负边距问题,确实尽量避免使用它们,但没有遇到任何问题,所以即使文档指出,我也不是担心它。

4

8 回答 8

208

2010 年,@RomainGuy(核心 Android 工程师)表示负边距具有未指明的行为

2011 年,@RomainGuy 表示您可以在上使用负边距LinearLayoutRelativeLayout

2016 年,@RomainGuy 表示他们从未得到官方支持,也不会得到ConstraintLayout.

不过,解决这个限制很容易。

在基本视图的底部添加一个辅助视图(高度 0dp,宽度限制为父视图),在底部添加所需的边距。
然后将您的视图置于此视图下方,有效地使其具有“负”边距,但不必使用任何不受支持的负值。

于 2012-05-20T12:53:20.060 回答
24

希望这会对某人有所帮助。ConstraintLayout这是基于@CommonsWare 回答的工作示例代码:

在基本视图的底部添加一个辅助视图(高度 0dp,宽度限制为父视图),在底部添加所需的边距。然后将您的视图置于此视图下方,有效地使其具有“负”边距,但不必使用任何不受支持的负值。

示例代码:

<TextView
    android:id="@+id/below"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F1B36D"
    android:padding="30dp"
    android:text="I'm below"
    android:textColor="#ffffff"
    android:textSize="48sp"
    android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<android.support.v4.widget.Space
    android:id="@+id/space"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    android:id="@+id/top"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:textAlignment="center"
    android:textColor="#ffffff"
    android:text="I'M ON TOP!"
    android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

输出:

在此处输入图像描述

于 2018-07-07T02:21:00.690 回答
17

如果您想使用负边距,请为容器及其​​clipToPadding设置足够的填充为false 并为其子视图设置负边距,这样它就不会裁剪子视图!

于 2013-10-17T15:26:23.240 回答
13

translationX您可以使用:和.而不是负边距 translationY

例子:

android:layout_marginBottom = -2dp

android:translationY = -2dp

更新:请记住,整个视图都已翻译。

于 2021-02-23T15:15:22.193 回答
5

过去这可能是不好的做法,但使用 Material Design 及其浮动操作按钮,这似乎是不可避免的,现在在许多情况下都是必需的。基本上,当您有两个单独的布局时,您不能将它们放入单个 RelativeLayout,因为它们需要明显分开的处理(例如,考虑标题和内容),重叠 FAB 的唯一方法是使其突出于那些使用负边距的布局。这给可点击区域带来了额外的问题。

于 2014-12-21T12:03:31.093 回答
3

对我来说,关于在 TextView 上设置负边距(我意识到 OP 指的是 ViewGroup,但我正在寻找设置负边距的问题,然后我来到这里)......我发现 4.0.3 有问题( API 15) 仅设置android:layout_marginTop或设置android:layout_marginBottom为负值,例如 -2dp。

由于某种原因,TextView 根本不显示。它似乎从视图中“消失”了(不仅仅是不可见)。

当我尝试使用其他 3 个版本的 layout_margin 时,我没有看到问题。

请注意,我没有在真实设备上尝试过,这是使用 4.0.3 模拟器。这是我发现仅影响 4.0.3 的第二件奇怪的事情,所以我的新规则是始终使用 4.0.3 模拟器进行测试 :)

android:lineSpacingExtra="-2dp"即使我碰巧有,我也成功地通过使用 which 来减少 TextView 的底部边距android:singleLine="true"(所以我不会认为行间距会是一个因素)。

于 2014-10-03T10:09:05.083 回答
3

不,你不应该使用negative margin. 相反,您应该使用translate. 即使负边距有时会起作用,当您以可编程方式更改布局时,翻译也会有所帮助。并且在您使用边距时,视图不会溢出屏幕。

于 2018-06-28T05:48:54.313 回答
0

我只知道这在相当短的时间内是可能的。但我认为它没有问题。请注意屏幕尺寸等,这样您就不会意外地制作不应出现在屏幕上重叠的项目。(即文本顶部的文本可能是个坏主意。)

于 2012-05-20T12:49:03.807 回答