说明:RealtiveLayout是目前android开发中最最常用的布局管理器(比LinearLayout还常用),布局内的子组件的位置总是相互依照其他子组件和RealtiveLayout布局本身来确定的。这样最大的好处就是更加自由灵活,可以设计出更加炫酷复杂的界面,而且可以在IDE中通过直接拖拽来进行界面的布局设计。
注意:RealtiveLayout的子组件不可以设置android:layout_gravity属性。
RealtiveLayout中需要关注的属性就比较多了,大概可以分为三类:
1 android:ignoreGravity
对应方法:setIgnoreGravity(int)
说明:设置不受gravity属性影响的子组件。跟其他布局一样,Realtivelayout也可以使用android:gravity属性来设置其子组件的摆放位置,但RealtiveLayout需要实现更加复杂的布局,所以为所有组件设置统一的摆放方式难以满足实际开发中的一些特殊需求,于是就有了这个属相来进行特殊的忽略。
举个栗子:
<RelativeLayout
android:gravity="bottom"
android:ignoreGravity="@id/view1"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/view1"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:src="@drawable/muogu" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:src="@drawable/nailiu16" />
</RelativeLayout>
可以看到,由于RealtiveLayout中设置了gravity为bottom,所以第二个ImageView被摆放到了布局的底部,而ignoreGravity中设置了的view1就依然是我行我素地从左上角开始摆放。
2 只能设置为true、false的xml属性
说明:这一类属性主要是为了弥补RealtiveLayout子组件不能设置layout_gravity属性的遗憾,可以直接为子组件指定摆放位置。
以下是这类属性的属性表:
属性名 | 功能说明 |
---|---|
android:layout_centerHoriazontal | 控制该子组件是否相对于父容器水平居中 |
android:layout_centerVertical | 控制该子组件是否相对于父容器垂直居中 |
android:layout_centerInParent | 控制该子组件是否相对于父容器居中 |
android:layout_alignParentBottom | 控制该子组件是否与父容器底端对齐 |
android:layout_alignParentTop | 控制该子组件是否与父容器顶端对齐 |
android:layout_alignParentLeft | 控制该子组件是否与父容器左端对齐 |
android:layout_alignParentRight | 控制该子组件是否与父容器右端对齐 |
android:layout_alignParentEnd | 控制该子组件是否与父容器结束对齐(大部分情况下与alignParentRight一个效果) |
android:layout_alignParentStart | 控制该子组件是否与父容器开始对齐(大部分情况下与alignParentLeft一个效果) |
需要注意的是,这些属相是可以同时使用的,不过如果同时使用相互冲突的属性(比如layout_alignParentLeft和layout_alignParentRight)会产生一些比较古怪的效果,所以不建议同时使用有冲突的属性。
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/view1"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="fitXY"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@drawable/muogu" />
</RelativeLayout>
系统会努力去适应所有的属性,导致组件被拉伸成很古怪的样子。
3 只能设置为其他UI组件ID的xml属性
说明:这些属相就是RealtiveLayout的核心属性,就是通过这些属性,来确定各个子组件在布局方面的相互关系的。
以下是这类属性的属性表:
属性名 | 功能说明 |
---|---|
android:layout_toRightOf | 控制该子组件位于ID指定组件的右侧 |
android:layout_toLeftOf | 控制该子组件位于ID指定组件的左侧 |
android:layout_above | 控制该子组件位于ID指定组件的上方 |
android:layout_below | 控制该子组件位于ID指定组件的下方 |
android:layout_alignTop | 控制该组件顶端与ID指定组件的上边界对齐 |
android:layout_alignBottom | 控制该底端组件与ID指定组件的下边界对齐 |
android:layout_alignLeft | 控制该组件左端与ID指定组件的左边界对齐 |
android:layout_alignRight | 控制该组件右端与ID指定组件的右边界对齐 |
android:layout_alignStart | 控制该组件起始位置与ID指定组件的起始位置对齐(大部分情况下与layout_alignLeft效果相同) |
android:layout_alignEnd | 控制该组件结束位置与ID指定组件的结束位置对齐(大部分情况下与layout_alignRight效果相同) |
另外可以使用margin或padding对组件进行细微的调整,如下所示:
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/view1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentEnd="true"
android:src="@drawable/nailiu16"
android:scaleType="fitXY" />
<ImageView
android:id="@+id/view2"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/muogu"
android:scaleType="fitXY"
android:layout_alignParentRight="true"
android:layout_below="@+id/view1" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/muogu"
android:scaleType="fitXY"
android:layout_margin="50dp"
android:layout_alignParentRight="true"
android:layout_alignBottom="@+id/view2" />
</RelativeLayout>
附:引用声明
《疯狂Android讲义(第二版)》 李刚 《2.2.4 相对布局》 电子工业出版社