一、Android布局介绍 1.简介
- Android中所有的UI(用户界面)元素都是使用View和ViewGroup对象建立的
- View是一个可以将一些信息绘制在屏幕上并与用户产生交互的对象
- ViewGroup是一个包含多个的View和ViewGroup的容器,用来定义UI布局
- Android提供了一系列的View和ViewGroup的子类,开发者可以灵活地组合使用它们来完成界面布局,界面元素绘制和用户交互等工作
- 开发者还可以选择性地继承一些系统提供的View,来自定义View,把自己定义的界面元素显示给用户
- Android的UI开发使用层次模型来完成,一般都是在一个ViewGroup中嵌套多层ViewGroup,每一层中含有任意数目的View
注意:嵌套层次不要超过10层,否则会大幅降低运行效率,上图为3层
2.AndroidUI的开发分类:
- 界面布局开发------定义界面布局
- 控件开发------定义单个界面元素
- AdapterView与Adapter开发------列表显示
- UI组件开发------对话框,通知,菜单等
- 自定义View,图形图像和动画------通过代码,自行绘制界面
- LinearLayout:线性布局
- RelativeLayout:相对布局
- FrameLayout:帧布局
- TableLayout:表格布局
- AbsoluteLayout:绝对布局
- GridLayout:网格布局
- 定义UI布局的最常用的方法是使用XML布局文件
- 如同HTML一样,XML为布局提供了一种可读的结构
- XML中的每个元素都是View或ViewGroup的子孙类的对象
- 可以把每一个XML布局文件理解为一颗由View和ViewGroup的子孙类对象组成的树
-
树根是一个ViewGroup对象,所有的叶节点都是View对象,树的分支点都是ViewGroup对象
注意:Android中ViewGroup可以嵌套包含很多View以及ViewGroup对象,而ViewGroup是View的子类
二、Android UI之屏幕适配器
- 屏幕尺寸:指屏幕的对角线长度,单位为英寸,1英寸=2.54厘米
- 屏幕分辨率:水平和垂直方向的像素点的个数,单位是px,1px=1像素点。(一般以垂直像素x水平像素,如1024x768)
- 屏幕像素密度:指每英寸上的像素点数,单位是dpi。(屏幕像素密度与屏幕尺寸和屏幕分辨率有关)
- dpi与屏幕尺寸对应关系:
- dpi与分辨率:
- 计算公式: dpi=(√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸
- px:像素点,构成图像的最小单位
- dip:设备独立像素,也叫密度无关像素,以160dpi为基准,1dip=1px,而240dpi中,1dip=1.5px等等
- dp:与dip相同
- sp:专门用于字体的像素单位
三、Android UI之线性布局(LinearLayout)
- LinearLayout,即线性布局,其中的控件会自动按照水平或垂直的方式一次排列
- 使用android:orientation="vertical" 属性可以指定为垂直
- 使用android:orientation="horizontal"属性可以指定为水平,默认是水平
- 其中的控件可以使用android:layout_marginXXX(XXX:Left、Top等)属性设置该控件距离左,上边界的间距如果需要设置控件内部的距离,使用android:layout_paddingXXX(XXX:Left、Top等)属性设置控件内部内容距离控件边缘的距离
- wrap_content:包裹内容
- match_parent:匹配父类
- margin:表示控件距离其他的控件或者屏幕边缘的边距(外边距)
- padding:表示为控件的内部内容距离控件的边缘的间距(内边距)
- gravity:表示控件内部的内容的对齐方式
-
layout_gravity:用于设置该View在其父View中的对其方式
注意:如果线性布局的排布方式为水平,那么layout_gravity在水平方向上就不起作用,只有在垂直方向上有效果,反之则在水平方向上有效果
- LinearLayout特有的属性:android:layout_weight,他表示比重的意思,可实现半分比布局
- 如果控件为"match_parent",则layout_weight的值与占用比重是相反关系的,其值越大,它占用的比重越小
-
如果控件为"wrap_content",则对比重的判断会变为正相关,即其值越小,占用的空间越少
注意:在一个页面中,有一个有权重的空间和一个无权重的空间,此时系统会先给无权重的控件分配控件,才会得到需要百分比的空间大小来进行百分比的划分,权重只存在于LinearLayout布局中
四、Android UI之相对布局(RelativeLayout)
- 相对布局中所有的视图组件都是按照相互之间的位置来确定的,需要有一个参照物
- RelativeLayout中往往需要定义一个控件的资源ID
- layout_alignXXX表示对齐方式(XXX代表左右上下)
- layout_marginXXX表示间距
- layout_centerVertical:垂直居中
- layout_centerHorizontal:水平居中
- layout_centerInParent:父类居中
- layout_alignParentTop:对齐父容器顶部
- layout_alignParentLeft:对齐父容器左部
- layout_alignParentRight:对齐父容器右部
-
layout_alignParentBottom:对齐父容器底部
注意:layout_width和layout _height是在平面图形中不可或缺的两个属性,任何图形需要显示都需要宽和高
- layout_toRightOf:在某个控件的右方(可以更换方向)
- layout_alignBottom:底部对齐(可以更换方向)
- layout_alignBaseline:基准线对齐
-
layout_below:在某个控件的下方
注意:@+id表示的是系统中本来不存在对应的id值,需要将这个id值添加到系统当中,@id表示从系统中取出已经添加好的id
五、Android UI之表格布局(TableLayout)
- TableLayout属于行和列形式的管理控件,每行为一个TableRow对象,也可以是一个View对象
- 在TableRow中还可以继续添加其他的控件,每添加一个子控件就会成为一列,TableLayout不会生成边框
- TableLayout是继承自LinearLayout
- TableLayout自身属性如下:
注意:TableRow的宽和高可以不指定,系统会自动设置其宽和高
六、Android UI之帧布局(FrameLayout)
- 帧布局中的每一个组件都代表一个画面
- 默认以屏幕左上角为(0,0)坐标,按组件定义的先后顺序一次逐屏显示,后面出现的会覆盖前面的画面
- 用该布局可以实现动画效果
七、Android UI之绝对布局(AbsoluteLayout)
- AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置
- 这种布局简单直接,直观性强
- 使用android:layout_x属性来确定X坐标,以左上角为顶点
- 使用android:layout_y属性来确定Y坐标,以左上角为顶点
- 如果子元素不设置layout_x和layout_y,那么他们的默认值是0,会出现在左上角
- 由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差,不推荐使用
八、Android UI之网格布局(GridLayout)
- android4.0以上版本出现
- 可以实现合并行合并列的效果
- android:columnCount:网格显示几列
- android:RowCount:网格显示几行
- android:layout_columnSpan:扩展列的数目
- android:layout_rowSpan:扩展行的数目
- android:layout_gravity:填充方式
右边为GridLayout布局处理效果