布局过程的含义

布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。

布局过程的工作内容

两个阶段:测量阶段和布局阶段。

测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置; 布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们。

View 或 ViewGroup 的布局过程

  1. 测量阶段,measure() 方法被父 View 调用,在 measure() 中做一些准备和优化工作后,调用 onMeasure() 来进行实际的自我测量。 onMeasure() 做的事,View 和 ViewGroup 不一样:

    1. ViewView 在 onMeasure() 中会计算出自己的尺寸然后保存;
    2. ViewGroupViewGroup 在 onMeasure() 中会调用所有子 View 的 measure() 让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置(实际上 99.99% 的父 View 都会使用子 View 给出的期望尺寸来作为实际尺寸,原因在下期或下下期会讲到)然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;
  2. 布局阶段,layout() 方法被父 View 调用,在 layout() 中它会保存父 View 传进来的自己的位置和尺寸,并且调用 onLayout() 来进行实际的内部布局。onLayout() 做的事, View 和 ViewGroup 也不一样:

    1. View:由于没有子 View,所以 View 的 onLayout() 什么也不做。
    2. ViewGroupViewGroup 在 onLayout() 中会调用自己的所有子 View 的 layout() 方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。

布局过程自定义的方式

三类:

  1. 重写 onMeasure() 来修改已有的 View 的尺寸;
  2. 重写 onMeasure() 来全新定制自定义 View 的尺寸;
  3. 重写 onMeasure() 和 onLayout() 来全新定制自定义 ViewGroup 的内部布局。

第一类自定义的具体做法

也就是重写 onMeasure() 来修改已有的 View 的尺寸的具体做法:

  1. 重写 onMeasure() 方法,并在里面调用 super.onMeasure(),触发原有的自我测量;
  2. 在 super.onMeasure() 的下面用 getMeasuredWidth() 和 getMeasuredHeight() 来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果;
  3. 调用 setMeasuredDimension() 来保存新的结果。

第二类全新定制自定义 View 的尺寸

  • 全新定制尺寸和修改尺寸的最重要区别

需要在计算的同时,保证计算结果满足父 View 给出的的尺寸限制

  • 父 View 的尺寸限制

  1. 由来:开发者的要求(布局文件中 layout_ 打头的属性)经过父 View 处理计算后的更精确的要求;
  2. 限制的分类: 
    1. UNSPECIFIED:不限制
    2. AT_MOST:限制上限
    3. EXACTLY:限制固定值
  • 全新定义自定义 View 尺寸的方式

    1. 重新 onMeasure(),并计算出 View 的尺寸;
    2. 使用 resolveSize() 来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。

第三类定制 Layout 内部布局的方式

  1. 重写 onMeasure() 来计算内部布局
  2. 重写 onLayout() 来摆放子 View
  • 重写 onMeasure() 的三个步骤:

  1. 调用每个子 View 的 measure() 来计算子 View 的尺寸
  2. 计算子 View 的位置并保存子 View 的位置和尺寸
  3. 计算自己的尺寸并用 setMeasuredDimension() 保存
  • 计算子 View 尺寸的关键

计算子 View 的尺寸,关键在于 measure() 方法的两个参数——也就是子 View 的两个 MeasureSpec 的计算。

  • 子 View 的 MeasureSpec 的计算方式:

  • 结合开发者的要求(xml 中 layout_ 打头的属性)和自己的可用空间(自己的尺寸上限 - 已用尺寸)
  • 尺寸上限根据自己的 MeasureSpec 中的 mode 而定
    • EXACTLY / AT_MOST:尺寸上限为 MeasureSpec 中的 size
    • UNSPECIFIED:尺寸无上限
  • 重写 onLayout() 的方式

在 onLayout() 里调用每个子 View 的 layout() ,让它们保存自己的位置和尺寸。

Android布局基础的更多相关文章

  1. Android UI基础之五大布局

    Android  UI基础之五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Andro ...

  2. Android零基础入门第29节:善用TableLayout表格布局,事半功倍

    原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...

  3. Android零基础入门第30节:两分钟掌握FrameLayout帧布局

    原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...

  4. Android零基础入门第28节:轻松掌握RelativeLayout相对布局

    原文:Android零基础入门第28节:轻松掌握RelativeLayout相对布局 在前面三期中我们对LinearLayout进行了详细的解析,LinearLayout也是我们用的比较多的一个布局. ...

  5. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  6. Android零基础入门第32节:新推出的GridLayout网格布局

    原文:Android零基础入门第32节:新推出的GridLayout网格布局 本期主要学习的是网格布局是Android 4.0新增的布局,和前面所学的TableLayout表格布局 有点类似,不过他有 ...

  7. Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局

    原文:Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局 前面几期基本学习了Android开发中常用的四种布局,之所以把AbsoluteLayout放在后面来学习 ...

  8. Android零基础入门第71节:CardView简单实现卡片式布局

    还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...

  9. 20145213 《Java程序设计》实验四 Android开发基础

    20145213 <Java程序设计>实验四 Android开发基础 说在前面的话 不同以往实验,对于这次实验具体内容我是比较茫然的.因为点我,打开实验四的链接居然能飘出一股熟悉的味道,这 ...

随机推荐

  1. mtk预装apk 方案公司内置预装apk

    mtk预装apk 方案公司内置预装apk 韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha == MTK 预知第三方的APK 流程_yua ...

  2. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  3. [CF1063F]String Journey

    题意:定义长度为$k$的journey为一个字符串序列$t_{1\cdots k}$,对$\forall i\gt1$满足$t_i$是$t_{i-1}$的严格子串,定义字符串$s$上的journey为 ...

  4. [AGC027F]Grafting

    题意:给定两棵树,一次操作形如:选一个未被选过的叶子,改变它的一条出边,问能否在第一棵树上做一些操作使得它变成第二棵树,如果能则询问最小操作次数 如果答案不是$n$,那么存在一个点$r$没有被选中过 ...

  5. 【计算几何】【极角排序】Gym - 101174B - Bribing Eve

    把每件物品当成平面上一个点,将第一件物品放在原点.那个权重值相当于一条直线,于是相当于直线绕原点转一圈,统计上侧点的数量. 队友的代码: #include <cmath> #include ...

  6. 【构造】Gym - 101411F - Figure ans Spots

    在最外围的一圈没有意义,所以全都涂黑,内部贪心地涂成棋盘即可. #include<cstdio> #include<cstring> using namespace std; ...

  7. css排版之-标准文档流

    标准流指的是在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则.HTML文档中的元素可以分为两大类:行内元素和块级元素.       1.行内元素不占据单独的空间,依附于块级元素,行 ...

  8. [转]spring的ParameterMethodNameResolver

    例1: ParameterMethodNameResolver,这个可以根据请求的参数来确定一个需要调用的方法.例如,http://www.sf.net/index.view?testParam=te ...

  9. 【QQ输入法】QQ输入法-剪切板 释放内存

    发现一个神奇的情况: 清除和关闭的操作: 1. 2.右键 3.点击 4.清空 5.最后需要关闭 QQ输入法的进程

  10. 【shiro】关于shiro匹配URL的小用法

    今天涉及到这个地方 1.登录请求需要带着username和password一起过去,这样的话发出的请求就是:http://localhost:8080/wxSecond/welcome/login.h ...