ConstraintLayout,向上(负)移动一个LinearLayout

ConstraintLayout, move a LinearLayout up (negatively)

我正在使用 Kotlin 将一些项目迁移到 AndroidX。根据文档,我已经知道 ConstraintLayout 有一些问题:

Negative margins will not be supported in ConstraintLayout. [...]

但是我有以下情况:

我需要将 LinearLayout 向上移动 5dp,但是我需要高度继续匹配屏幕的下限。也就是说,我向上移动 5dp 并将高度增加 5dp。

如图所示,我已经尝试过 translateY,但它只是移动了整个视图(不是我需要的)。此外,我无法在 id#top 内创建高度为 5dp 并与 constraintTop_toTopOf、 对齐的视图,因为它们属于不同的组

这种情况有什么解决办法吗?

ConstraintLayout 的全部目的是拥有一个平面视图层次结构。因此,嵌套 LinearLayout 达不到目的。

我建议你去掉嵌套的 LinearLayouts 并使用约束来做所有事情。

在 ConstraintLayout 中让视图重叠很棘手,但您可以通过添加不可见视图并将重叠视图约束到不可见视图来实现。

在这种情况下,不可见视图的底部可以限制在绿色 LinearLayout 的底部,底部边距为 5dp。然后红色的 LinearLayout 可以将其顶部限制在不可见视图的底部。这应该会给你 5dp 的重叠。

尝试将以下内容复制粘贴到您的约束布局中

            <LinearLayout
                android:id="@+id/green"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:orientation="vertical"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:background="@android:color/holo_green_light" />

            <View
                android:id="@+id/dummyView"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_marginBottom="5dp"
                android:visibility="invisible"
                app:layout_constraintBottom_toBottomOf="@id/green"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"/>

            <LinearLayout
                android:id="@+id/red"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_marginStart="16dp"
                android:layout_marginEnd="16dp"
                android:orientation="vertical"
                app:layout_constraintTop_toBottomOf="@id/dummyView"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                android:background="@android:color/holo_red_light" />

请注意,当在 ConstraintLayout 的子视图上设置时,“0dp”的尺寸意味着 "match constraints"。这并不明显,但实际上记录在此处 https://developer.android.com/reference/android/support/constraint/ConstraintLayout