android RelativeLayout布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><Buttonandroid:id="@+id/b1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="b1" /><Buttonandroid:id="@+id/b2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:text="b2" /></RelativeLayout>
按道理来说 ,应该是b2贴在父容器左边,b1在中间,实际上
b1 b2重叠了 为什么会这个样子?
关键原因:父容器的 gravity
作用于所有子组件的整体重心
安卓的坐标系是左上角原点(0,0)垂直往下,y的值越来越大,原点(0,0)平行向右,x的值 越来越大。然后原点(0,0)垂直向上,y 是负的。原点(0,0)平行向左,x 变成负的。
- 如果子视图没有设置任何布局属性(如
layout_alignParentLeft
、layout_centerInParent
等),则会根据父容器的gravity
确定位置。
- 如果子视图设置了明确的布局规则(如 “靠左”“居中” 等),则会优先遵循自身的布局规则,父容器的
gravity
对其不产生影响。
所以,子组件b1受到 父容器的 gravity
作用,居中 ,而父容器的 gravity
作用于所有子组件的整体重心,所以b1的位置刚好就是原点(0,0)。
b2设置的是靠近父容器左边,位置也是(0,0),因此就重叠了。
虽然我的解释可能有问题。但是实际上。却达到了正确的效果。
约束类型 | 具体属性 | 优先级 |
---|---|---|
强制坐标约束 | layout_x 、layout_y | 1(最高) |
父子对齐约束 | layout_alignParentXXX 、layout_centerInParent 等 | 2 |
子视图边界对齐约束 | layout_alignXXXOf (如 layout_alignRightOf ) | 3 |
子视图方向约束 | layout_toXXXOf 、layout_above 等 | 4 |
偏移量约束 | layout_marginXXX | 5(最低) |