在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),GridLayout(网格布局),RelativeLayout(相对布局),TableLayout(表格布局),AbsoluteLayout(绝对布局)现很少使用。
(1)LinearLayout
,其实就是线性布局,结构层次相对来说简单非常明了,只有横和竖2条直线的方向。这里主要记录下LinearLayout的重要属性,以及使用时需要注意的事项。
在XML布局中:
1.排列方式orientation
android:orientation=“vertical”//垂直排列
android:orientation=“horizontal”//水平排列
控制LinearLayout的子控件内部具体的排列顺序,还需要使用android:layout_gravity这个属性。
可是当orientation为vertical时,子控件设置android:layout_gravity="center_vertical"或者自身设置android:gravity="center_vertical"是无效的。
同样当orientation为horizontal时,子控件设置android:layout_gravity="center_horizontal"或者自身设置android:gravity="center_horizontal"是无效的。
2.摆放位置gravity
从上面可以得知:在父控件中android:gravity属性和其子控件的android:layout_gravity效果是一样的。
既然上面提到了gravity,下面就对它的选项(可以多选)进行下解释:
center:居中 center_horizontal:水平居中 center_vertical:垂直居中
left:偏左 |right:偏右 (start和end:详见 这里有这2个属性的解释)
bottom:偏下 |top:偏上
fill:充满容器 |fill_horizontal:水平方向充满容器 |fill_vertical:垂直方向充满容器
clip_horizontal:水平裁剪|clip_vertical:垂直裁剪
3.分割线showDividers
既然是设置分割线,首先我们就需要有分割线:
android:divider="@drawable/drawable"//分割线的drwable,不能直接给color(无效)
android:dividerPadding=“0.5dp”//分割线高度或者宽度
分割线的Shape.xml:
size必须设置,不然显示不出
选择的样式(可以多选):
LinearLayout.SHOW_DIVIDER_BEGINNING;//开始的分割线
LinearLayout.SHOW_DIVIDER_MIDDLE;//中间的分割线
LinearLayout.SHOW_DIVIDER_END;//结束的分割线
LinearLayout.SHOW_DIVIDER_NONE;//没有分割线
其他方法:
用一个View将高度或宽度设置为match_parent,另一个长度设置为0.5dp,设置一个background来达到分割线的效果:
在开发中,用的这种方式,可是个人觉得上面这个方式,代码比较简约
4.权重weight
两个元素的话,第一个wrap_content,第二个设置weight = 1,先由第一个元素把长度分配好,剩下的长度全都给第二个元素。
三个元素的话,第一个wrap_content,第二个设置weight = 1,第三个设置2,先由第一个元素把长度分配好,剩下的长度由第二第三个元素按1:2的比例分配。
所以,权重就是首先按照分配的长度来给予长度,剩余的长度再按权重的比例来分配。
(2)RelativeLayout
的子元素属性
相对于兄弟元素
android:layout_below="@id/aaa":在指定View的下方
android:layout_above="@id/xxx":在指定View的上方
android:layout_toLeftOf="@id/bbb":在指定View的左边
android:layout_toRightOf="@id/cccc":在指定View的右边
相对于父元素
android:layout_alignParentLeft=“true”:在父元素内左边
android:layout_alignParentRight=“true”:在父元素内右边
android:layout_alignParentTop=“true”:在父元素内顶部
android:layout_alignParentBottom=“true”:在父元素内底部
对齐方式
android:layout_centerInParent=“true”:居中布局
android:layout_centerVertical=“true”:水平居中布局
android:layout_centerHorizontal=“true”:垂直居中布局
android:layout_alignTop="@id/xxx":与指定View的上边界一致
android:layout_alignBottom="@id/xxx":与指定View下边界一致
android:layout_alignLeft="@id/xxx":与指定View的左边界一致
android:layout_alignRight="@id/xxx":与指定View的右边界一致
区别
都是继承自View.Group,是一种容器控件,LinearLayout的布局层次比较简单,方向和位置都比较容易控制,而相对布局RelativeLayout 对于其内子控件提供了更加丰富的布局层次和布局位置。
两者绘制同样的界面时layout和draw的过程时间消耗相差无几,关键在于measure过程RelativeLayout比LinearLayout慢了一些。我们知道ViewGroup是没有onMeasure方法的,这个方法是交给子类自己实现的。因为不同的ViewGroup子类布局都不一样,那么onMeasure索性就全部交给他们自己实现好了。
1) RelativeLayout慢于LinearLayout是因为它会让子View调用2次measure过程,而后者只需一次,但是有weight属性存在时,后者同样会进行两次measure。
2) RelativeLayout的子View如果高度和RelativeLayout不同,会引发效率问题,可以使用padding代替margin以优化此问题。
3) 在不响应层级深度的情况下,使用Linearlayout而不是RelativeLayout。
据此,说明两个常见的,暂时没有引起注意的事情:
①作为顶级View的DecorView却是个垂直方向的LinearLayout,上面是标题栏,下面是内容栏,我们常用的setContentView()方法就是给内容栏设置布局。采用RelativeLayout并不会降低层级深度,因此这种情况下使用LinearLayout效率更高。
②为开发者默认新建RelativeLayout是希望开发者能采用尽量少的View层级,很多效果是需要多层LinearLayout的嵌套,这必然不如一层的RelativeLayout性能更好。因此我们应该尽量减少布局嵌套,减少层级结构,使用比如viewStub,include等技巧。可以进行较大的布局优化。
(3)TableLayout
Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。
当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。
当为View时,该View将独占一行。
常用属性
android:collapseColumns:将TableLayout里面指定的列隐藏,若有多列需要隐藏,请用逗号将需要隐藏的列序号隔开。
ex: android:collapseColumns="*" 隐藏所有行
android:stretchColumns:设置指定的列为可伸展的列,以填满剩下的多余空白空间,若有多列需要设置为可伸展,请用逗号将需要伸展的列序号隔开。
ex: android:stretchColumns=“0” 第0列可伸展
android:shrinkColumns:设置指定的列为可收缩的列。当可收缩的列太宽(内容过多)不会被挤出屏幕。当需要设置多列为可收缩时,将列序号用逗号隔开。
ex: android:shrinkColumns=“1,2” 第1,2列收缩
android:layout_colum:设置该控件在TableRow中指定的列。
ex: android:layout_column=“1” 该控件显示在第1列
android:layout_span:设置该控件所跨越的列数。
ex: android:layout_span=“2” 该控件占据2列
(4)FrameLayout
FrameLayout帧布局在屏幕上开辟出了一块区域,在这块区域中可以添加多个子控件,但是所有的子控件都被对齐到屏幕的左上角。帧布局的大小由子控件中尺寸最大的那个子控件来决定。如果子控件一样大,同一时刻只能看到最上面的子控件。
FrameLayout继承自ViewGroup,除了继承自父类的属性和方法,FrameLayout类中包含了自己特有的属性和方法
属性:
android:foreground:设置该帧布局容器的前景图像:设置前景图像显示的位置
(5)GridLayout
跟LinearLayout(线性布局)一样,他可以设置容器中组件的对齐方式,容器中的组件可以跨多行也可以跨多列(相比TableLayout直接放组件,占一行相比较)
属性:
android:layout_gravity center,left,right,buttom等,如果想同时用两种的话:eg: buttom|left设置组件的排列方式
android:rowCount ex: android:rowCount=“4” 设置网格布局有4行
android:columnCoun ex: android:columnCount=“4” 设置网格布局有4列
android:layout_rowSpan ex: android:layout_rowSpan = “2” 纵向横跨2行
android:layout_columnSpan ex: