关于layout_gravity和重力的垂直和水平方向的区别

The difference between vertical and horizontal orientation about layout_gravity and gravity

我在 LinearLayout 中有一个 TextView。

我想尝试 layout_gravity 和重力的不同模式。

我有这个代码:

<LinearLayout
    android:layout_width="150dp"
    android:layout_height="50dp"
    android:background="#A55C93"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/textView1"
        android:background="#005Cff"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_width="50dp"
        android:layout_height="25dp"
        android:text="text"
        android:textSize="21sp" />
</LinearLayout>

当我有 android:orientation="vertical" 时,关于 layout_gravitygravity 的一切都有意义。但是当我有 android:orientation="horizontal" 时,输出与第一个不同,为什么?

试试这个代码,你会发现不同之处 增加布局高度以查看差异;它将帮助您更好地理解流程

当您将重心设置为水平线性布局时,中心不是指水平中心,而是垂直中心。

我知道这听起来很混乱,但试试这段代码,你会更好地理解我想说的话。

<LinearLayout
android:layout_width="150dp"
android:layout_height="500dp"
android:background="#A55C93"
android:orientation="horizontal"
>
<TextView
    android:id="@+id/textView1"
    android:background="#005Cff"
    android:layout_gravity="center"
    android:layout_width="50dp"
    android:layout_height="25dp"
    android:text="text"
    android:textSize="21sp"
    />
</LinearLayout>

也可以尝试垂直

<LinearLayout
android:layout_width="150dp"
android:layout_height="500dp"
android:background="#A55C93"
android:orientation="vertical"
  tools:ignore="MissingConstraints"

  >
<TextView
    android:id="@+id/textView1"
    android:background="#005Cff"
    android:layout_gravity="center"
    android:layout_width="50dp"
    android:layout_height="25dp"
    android:text="text"
    android:textSize="21sp"
    />
</LinearLayout>

尝试向布局添加多个视图,这将帮助您给出一个准确的想法。 换句话说,在水平方向的线性布局中,如果您设置布局重心,您的视图将对齐到线性布局的高度中心,如果您将布局重心设置为垂直对齐的线性布局,它将对齐您的视图中心到线性布局的宽度

要理解的主要事情是 child 视图上的 layout_gravity 是一个属性,它“向上”传达 parent,并“询问”parent 以某种方式行事。

在这种情况下,parent 是一个 LinearLayout,它具有不同的属性 (orientation),该属性已经影响 child 视图的定位。因此,当 child 指定 layout_gravity 时,会发生什么取决于 LinearLayoutorientation

  • 对于 horizontal LinearLayout,child 的 layout_gravity 的任何水平组件都将被忽略。
  • 对于 vertical LinearLayout,忽略 child 的 layout_gravity 的任何垂直组件。

您正在使用 center,基本上是 center_vertical + center_horizontal。所以对于水平的LinearLayout,水平居中将被忽略。并且,对于垂直的 LinearLayout,垂直居中将被忽略。

鉴于您的示例只有一个 child 视图,您可以考虑将 parent LinearLayout 替换为 FrameLayout。那么childlayout_gravity就会得到充分的尊重