Android布局基础
布局过程的含义
布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。
布局过程的工作内容
两个阶段:测量阶段和布局阶段。
测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置; 布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们。
View 或 ViewGroup 的布局过程
测量阶段,
measure()方法被父 View 调用,在measure()中做一些准备和优化工作后,调用onMeasure()来进行实际的自我测量。onMeasure()做的事,View和ViewGroup不一样:- View:
View在onMeasure()中会计算出自己的尺寸然后保存; - ViewGroup:
ViewGroup在onMeasure()中会调用所有子 View 的measure()让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置(实际上 99.99% 的父 View 都会使用子 View 给出的期望尺寸来作为实际尺寸,原因在下期或下下期会讲到)然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;
- View:
布局阶段,
layout()方法被父 View 调用,在layout()中它会保存父 View 传进来的自己的位置和尺寸,并且调用onLayout()来进行实际的内部布局。onLayout()做的事,View和ViewGroup也不一样:- View:由于没有子 View,所以
View的onLayout()什么也不做。 - ViewGroup:
ViewGroup在onLayout()中会调用自己的所有子 View 的layout()方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。
- View:由于没有子 View,所以
布局过程自定义的方式
三类:
- 重写
onMeasure()来修改已有的View的尺寸; - 重写
onMeasure()来全新定制自定义View的尺寸; - 重写
onMeasure()和onLayout()来全新定制自定义ViewGroup的内部布局。
第一类自定义的具体做法
也就是重写 onMeasure() 来修改已有的 View 的尺寸的具体做法:
- 重写
onMeasure()方法,并在里面调用super.onMeasure(),触发原有的自我测量; - 在
super.onMeasure()的下面用getMeasuredWidth()和getMeasuredHeight()来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果; - 调用
setMeasuredDimension()来保存新的结果。
第二类全新定制自定义 View 的尺寸
全新定制尺寸和修改尺寸的最重要区别
需要在计算的同时,保证计算结果满足父 View 给出的的尺寸限制
父 View 的尺寸限制
- 由来:开发者的要求(布局文件中
layout_打头的属性)经过父 View 处理计算后的更精确的要求; - 限制的分类:
UNSPECIFIED:不限制AT_MOST:限制上限EXACTLY:限制固定值
全新定义自定义 View 尺寸的方式
- 重新
onMeasure(),并计算出 View 的尺寸; - 使用
resolveSize()来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。
- 重新
第三类定制 Layout 内部布局的方式
- 重写
onMeasure()来计算内部布局 - 重写
onLayout()来摆放子 View
重写 onMeasure() 的三个步骤:
- 调用每个子 View 的
measure()来计算子 View 的尺寸 - 计算子 View 的位置并保存子 View 的位置和尺寸
- 计算自己的尺寸并用
setMeasuredDimension()保存
计算子 View 尺寸的关键
计算子 View 的尺寸,关键在于 measure() 方法的两个参数——也就是子 View 的两个 MeasureSpec 的计算。
子 View 的 MeasureSpec 的计算方式:
- 结合开发者的要求(xml 中
layout_打头的属性)和自己的可用空间(自己的尺寸上限 - 已用尺寸) - 尺寸上限根据自己的
MeasureSpec中的 mode 而定- EXACTLY / AT_MOST:尺寸上限为
MeasureSpec中的size - UNSPECIFIED:尺寸无上限
- EXACTLY / AT_MOST:尺寸上限为
重写 onLayout() 的方式
在 onLayout() 里调用每个子 View 的 layout() ,让它们保存自己的位置和尺寸。
Android布局基础的更多相关文章
- Android UI基础之五大布局
Android UI基础之五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Andro ...
- Android零基础入门第29节:善用TableLayout表格布局,事半功倍
原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...
- Android零基础入门第30节:两分钟掌握FrameLayout帧布局
原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...
- Android零基础入门第28节:轻松掌握RelativeLayout相对布局
原文:Android零基础入门第28节:轻松掌握RelativeLayout相对布局 在前面三期中我们对LinearLayout进行了详细的解析,LinearLayout也是我们用的比较多的一个布局. ...
- Android零基础入门第25节:最简单最常用的LinearLayout线性布局
原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...
- Android零基础入门第32节:新推出的GridLayout网格布局
原文:Android零基础入门第32节:新推出的GridLayout网格布局 本期主要学习的是网格布局是Android 4.0新增的布局,和前面所学的TableLayout表格布局 有点类似,不过他有 ...
- Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局
原文:Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局 前面几期基本学习了Android开发中常用的四种布局,之所以把AbsoluteLayout放在后面来学习 ...
- Android零基础入门第71节:CardView简单实现卡片式布局
还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...
- 20145213 《Java程序设计》实验四 Android开发基础
20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...
随机推荐
- 转:西部数据NAS设备hack
通过该文学习一下常见硬件web漏洞.重点关注一下几个方面: 1.登录验证代码: 2.文件上传代码: 3.system/exec/popen等是否存在注入可能: 4.调用二进制文件: 5.未登陆可以访问 ...
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- javascript中的this总结
1.关于this 我们需要根据 "调用位置" 上函数的 "调用方式" 来确定函数中this使用的 "绑定规则" 2.绑定规则 非严格模式下: ...
- UTF-8 与 BIG-5 转码
BIG-5 轉 UTF-8 若要將一個文字檔從 BIG-5 編碼轉換為 UTF-8 編碼,可以執行: iconv -f BIG-5 -t UTF-8 big5.txt > utf8.txt 其中 ...
- 如何使用weinre来进行远程调试phonegap应用
使用phonegap开发的应用在真机上和PC上的显示效果以及浏览器渲染方式还是有些区别的.在PC端很好调试,各种浏览器都自带了调试工具,使用起来很方便,但是在一旦安装到了手机上,这个时候要进行调试就需 ...
- [Contest20170910]string
给定一个由且仅由字符$'H','T'$构成的字符串$S$ 给定一个最初为空的字符串$T$,每次随机地在$T$的末尾添加$'H'$或者$'T'$ 问当$S$为$T$的后缀时,在末尾添加字符的期望次数 妙 ...
- Idea集成svn
Idea集成svn 既然要使用svn,首先需要下载一个 svn的客户端,到这里下载对应的安装程序:http://subversion.apache.org/packages.html#windows ...
- Erlang学习记录(二)——基本数据类型
Erlang可以说和我以前接触过的语言都大不相同,这个从它的类型定义就可以看出来...反正学起来觉得既不熟悉,也不亲切,我估计在用Erlang写应用的时候,整个编程思路都要变一下了.不过存在即是合理的 ...
- Problem C: 调用函数,求a+aa+aaa+....+aa...aa(n个a)
#include <stdio.h> int fn(int a,int n)//定义函数 { ; ;i<=n;i++) { m=m+a;//当a=3时,m=3,然后a=30,m=33 ...
- maven项目修改项目名
修改pom文件下面三处
