前言
layout_gravity 和 gravity 是我们经常在 xml 中使用到的属性,可以说它们与我们的 UI 布局密不可分。使用它们给我们的开发带来了极大的便捷。但要知道,UI 设计是精细且繁琐的,我们如果不能很好的了解它们的不同和各种值的作用,就会造成差之毫厘谬以千里的结果,那是我们所不愿看到的。
这个博客就来讲解一下 layout_gravity 和 gravity的不同,还有它们的各种值的作用。
两者不同
gravity 的中文意思是”重心“,就是表示 View 横向和纵向的停靠位置。
android:gravity 是对 View 控件本身来说的,对 TextView 来说就是用来设置 View 本身的文本应该显示在 View 的什么位置,默认值是左侧。
android:layout_gravity 是相对于包含该元素的父元素来说的,设置该元素在父元素的什么位置。比如TextView,android:layout_gravity 表示 TextView 在界面上的位置。
一个小例子:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:text="button"
android:textSize="25sp"
android:gravity="bottom|center"
android:layout_gravity="bottom|center_horizontal"
android:layout_width="120dp"
android:layout_height="120dp" />
<Button
android:textSize="25dp"
android:text="button"
android:gravity="top|left"
android:layout_gravity="bottom|right"
android:layout_width="120dp"
android:layout_height="120dp" />
</LinearLayout>
Button1并没有按照我们设置的 layout_gravity 属性那样显示在界面的下方正中央,Button2也没有显示在界面的右下方。这是因为我们设置了LinearLayout的 orientation 属性为”vertical”。
对于LinearLayout如果设置 orientation=”vertical”,那么layout_gravity的设置只在水平方向生效,如上图Button1显示在屏幕的水平正中央,而Button2显示在水平方向的最右边。
如果设置 orientation=”horizontal”,那么layout_gravity属性只在垂直方向生效。
属性
属性 | 作用 |
---|---|
top | 将对象放在其容器的顶部,不改变其大小。 |
bottom | 将对象放在其容器的底部,不改变其大小。 |
left | 将对象放在其容器的左侧,不改变其大小。 |
right | 将对象放在其容器的右侧,不改变其大小 |
center_vertical | 将对象纵向居中,不改变其大小。垂直对齐方式:垂直方向上居中对齐。 |
fill_vertical | 必要的时候增加对象的纵向大小,以完全充满其容器。垂直方向填充 |
center_horizontal | 将对象横向居中,不改变其大小. 水平对齐方式:水平方向上居中对齐 |
fill_horizontal | 必要的时候增加对象的横向大小,以完全充满其容器. 水平方向填充 |
center | 将对象横纵居中,不改变其大小 |
fill | 必要的时候增加对象的横纵向大小,以完全充满其容器 |
clip_vertical | 附加选项,用于按照容器的边来剪切对象的顶部和/或底部的内容. 剪切基于其纵向对齐设置:顶部对齐时,剪切底部;底部对齐时剪切顶部;除此之外剪切顶部和底部。垂直方向裁剪 |
在这之外,还有 start 和 end 两个属性,之所以单独拿出来,是因为我们在使用 left 和 right的时候,会提示将left替换为start,right 换成 end,说明它们的功能有相同之处。
left和right代表一种绝对的对齐,而start和end表示基于阅读顺序的对齐。
主要的阅读顺序有两种:从左向右(LTR)和从右向左(RTL)。
当使用left的时候,无论是LTR还是RTL,总是左对齐的;而使用start,在LTR中是左对齐,而在RTL中则是右对齐。所以会建议我们使用 start 和 end,在其它时候它们是一样的。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="top"
android:gravity="top"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView02"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="bottom"
android:gravity="bottom"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView03"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="left"
android:gravity="left"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView04"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="right"
android:gravity="right"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView05"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="center_vertical"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView06"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="fill_vertical"
android:gravity="fill_vertical"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView07"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="center_horizontal"
android:gravity="center_horizontal"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView08"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="fill_horizontal"
android:gravity="fill_horizontal"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView09"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="center"
android:gravity="center"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView10"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="fill"
android:gravity="fill"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView11"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="clip_vertical"
android:gravity="clip_vertical"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView12"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="clip_horizontal"
android:gravity="clip_horizontal"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView13"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="start"
android:gravity="start"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
<TextView android:id="@+id/TextView14"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="end"
android:gravity="end"
android:textColor="#ffffff"
android:background="#ff0000"
android:layout_margin="1px"/>
</LinearLayout>
结束语:本文仅用来学习记录,参考查阅。