Разница между вертикальной и горизонтальной ориентацией в layout_gravity и gravity

#android #gravity #layout-gravity

#Android #гравитация #макет-гравитация

Вопрос:

У меня есть TextView в LinearLayout.

Я хочу попробовать разные режимы для layout_gravity и 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_gravity и gravity имеет смысл. Но когда у меня есть android:orientation="horizontal" , результаты отличаются от первого, почему?

Ответ №1:

Главное, что нужно понять, это то, что layout_gravity в дочернем представлении есть атрибут, который связывается «до» с родителем и «просит» родителя вести себя определенным образом.

В этом случае родительским является a LinearLayout , который имеет другой атрибут ( orientation ), который уже влияет на расположение дочерних представлений. Поэтому, когда дочерний элемент указывает layout_gravity , то, что происходит, зависит от LinearLayout ‘s orientation .

  • Для horizontal LinearLayout любой горизонтальный компонент дочернего layout_gravity элемента игнорируется.
  • Для vertical LinearLayout любой вертикальный компонент дочернего layout_gravity элемента игнорируется.

Вы используете center , что в основном означает center_vertical center_horizontal . Таким образом, для горизонтального LinearLayout горизонтальное центрирование будет проигнорировано. И для вертикального LinearLayout вертикальное центрирование будет проигнорировано.

Учитывая, что в вашем примере есть только одно дочернее представление, вы могли бы рассмотреть возможность замены родительского LinearLayout на FrameLayout . Тогда ребенок layout_gravity будет полностью уважаем.

Ответ №2:

попробуйте этот код, и вы увидите разницу увеличьте высоту макета, чтобы увидеть разницу; это поможет вам лучше понять поток

когда вы устанавливаете центр тяжести в горизонтальную линейную компоновку, центр не относится к горизонтальному центру, он относится к центру по вертикали.

я знаю, это звучит запутанно, но попробуйте этот код, и у вас будет лучшее представление о том, что я пытаюсь сказать.

 <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>
  

попробуйте добавить несколько представлений к макету, и это поможет вам получить точное представление.
другими словами, в горизонтально ориентированном линейном макете, если вы установите центр тяжести макета, ваш вид будет выровнен по центру высоты линейного макета, а если вы установите центр тяжести макета на вертикально выровненный линейный макет, он выровняет центр вашего вида по ширине линейного макета