onFinishInflate() 当View中所有的子控件 均被映射成xml后触发

onMeasure(int, int) 确定所有子元素的大小

onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发

onSizeChanged(int, int, int, int) 当view的大小发生变化时触发

一旦执行过onMeasure,往往就会执行onLayout来重新布局

二,实例展示:

android:id="@+id/root_layout"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="wrap_content" />

android:id="@+id/bottom_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:gravity="bottom"

android:orientation="vertical" >

android:id="@+id/button"

android:layout_width="fill_parent"

android:layout_height="100dp"

android:text="haha" >

android:id="@+id/textview"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="#77777777"

android:text="hello" />

上面是一些自定的view ,并重载了一个方法,打log分析:

按照上面的层次关系,每个view自定义一下,就是为了将三个方法打印出来,打印结果:

01-19 17:17:44.985: I/cdd(15351):

ReSizeLayout--------onSizeChanged--480,741,0,0

01-19 17:17:44.985: I/cdd(15351):

MyEditText--------onSizeChanged--480,65,0,0

01-19 17:17:44.985: I/cdd(15351):

MyEditText--------onLayout--0,0,480,65

01-19 17:17:44.985: I/cdd(15351):

MyLinearLayout--------onSizeChanged--480,676,0,0

01-19 17:17:44.985: I/cdd(15351):

MyTextView--------onSizeChanged--480,25,0,0

01-19 17:17:44.985: I/cdd(15351):

MyTextView--------onLayout--0,651,480,676

01-19 17:17:44.985: I/cdd(15351):

MyLinearLayout--------onLayout--0,65,480,741

01-19 17:17:44.985: I/cdd(15351):

ReSizeLayout--------onLayout--0,0,480,741

01-19 17:17:44.985: I/cdd(15351):

MyEditText--------onMeasure--480,741

01-19 17:17:44.985: I/cdd(15351):

MyTextView--------onMeasure--480,526

01-19 17:17:44.985: I/cdd(15351):

MyLinearLayout--------onMeasure--480,676

01-19 17:17:44.985: I/cdd(15351):

ReSizeLayout--------onMeasure--480,741

01-19 17:17:44.985: I/cdd(15351):

MyEditText--------onLayout--0,0,480,65

01-19 17:17:44.985: I/cdd(15351):

MyTextView--------onLayout--0,651,480,676

01-19 17:17:44.985: I/cdd(15351):

MyLinearLayout--------onLayout--0,65,480,741

01-19 17:17:44.995: I/cdd(15351):

ReSizeLayout--------onLayout--0,0,480,741

感觉执行顺序是这样的:

1. 首先是执行叶子child的onMeasure方法,逐层向上调用,最后调用到root的onMeasure,onMeasure本身的作用就是告诉父亲自己占用多大的位置,根据递归原理,onMeasure的确应该从下往上层调用

2. 调用到root的onMeasure后,其实这个统计大小的工作肯定是比root还高级别的View触发,也许就是DecorView,统计完大小后,开始调用onSizeChange,我想这里调用onSizeChange是因为首次显示的原因,调用onSizeChange是从root开始的,然后逐级调用到child,调用每个child的onSizeChange完毕后,每个child执行layout动作

3. 从顺序来看,layout动作和onMeasure一样,都是从小往上层调用。从叶子child的onlayout调用开始,最后调用到root的onlayout方法。因为只有大小发生了变化才会执行onSizeChange,所以没有onSizeChange的时候,就是从尾到头执行完onmeasure,再开始从尾到头执行完onlayout

4. 由此看来,onSizeChange并不一定会调用,只有View的大小发生变化才会调用,而且也不一定一定从root开始调用。onMeasure在整个界面上需要放置一样东西或拿掉一样东西时会调用。比如addView就是放置,removeview就是拿掉,另外比较特殊的是,child设置为gone会触发onMeasure,但是invisible不会触发onMeasure。一旦执行过onMeasure,往往就会执行onLayout来重新布局

5. 分支影响整个分支直到root,比如上面的root有两个孩子,这两个孩子是不同的分支,这两个孩子是同级别,如果又孩子在点击button的时候让textview消失掉

01-19 17:40:56.185: I/cdd(15481):

MyLinearLayout--------onMeasure--480,676

01-19 17:40:56.185: I/cdd(15481):

ReSizeLayout--------onMeasure--480,741

01-19 17:40:56.185: I/cdd(15481):

MyLinearLayout--------onLayout--0,65,480,741

01-19 17:40:56.185: I/cdd(15481):

ReSizeLayout--------onLayout--0,0,480,741

它会影响右分支所有直到root,所以同一分支比较容易影响。但是我们看到没有影响到左孩子

为什么没有影响到做孩子呢,是因为没有影响到他的大小或者位置。

比如,在root下面加入一个孩子,如果孩子是加在前面两个孩子后面,那么对前面两个孩子都没有影响。但是如果加在两个孩子中间,那么对第二个孩子影响,影响的话就会执行onmeasure和onlayout

a.加在两个孩子后面

01-19 17:53:53.235: I/cdd(15939):

ReSizeLayout--------onMeasure--480,741

01-19 17:53:53.235: I/cdd(15939):

ReSizeLayout--------onLayout--0,0,480,741

b.加在两个孩子中间

01-19 17:45:55.345: I/cdd(15846):

MyTextView--------onMeasure--480,454

01-19 17:45:55.345: I/cdd(15846):

MyLinearLayout--------onMeasure--480,604

01-19 17:45:55.345: I/cdd(15846):

ReSizeLayout--------onMeasure--480,741

01-19 17:45:55.345: I/cdd(15846):

MyLinearLayout--------onSizeChanged--480,604,480,676

01-19 17:45:55.345: I/cdd(15846):

MyTextView--------onLayout--0,579,480,604

01-19 17:45:55.345: I/cdd(15846):

MyLinearLayout--------onLayout--0,137,480,741

01-19 17:45:55.345: I/cdd(15846):

ReSizeLayout--------onLayout--0,0,480,741

6. 一个分支下的影响很可能就是一条线到root,同级别的影响先决条件是,改变同级的大小或者位置,有时候没有改变大小或者位置,也可能调用

Android布局measure,android  OnMeasure()深入理解(总结)相关推荐

  1. Android布局measure,Android View的Measure测量流程全解析

    相信绝大多数Android开发者都有自定义View来满足各种各样需求的经历,也知道一个View的绘制展示要经过measure.layout.draw三大流程,三者中measure的过程相比是稍微复杂一 ...

  2. xamarin android 布局,Xamarin.Android 上中下布局

    xml代码: xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_par ...

  3. 制作android布局模板,Android模板制作

    本文详细介绍模板相关的知识和如何制作Android模版及使用,便于较少不必要的重复性工作.比如我在工作中如果要创建一个新的模块,就不要需要创建MVP相关的几个类:Model.View.Presente ...

  4. android 布局滚动条,Android 布局控件——滚动条视图,日期,时间

    今天学长讲了一些控件,比较强的那种控件. 刚开始讲了图片,但是图片我前面写过了就跳过. 滚动条牛牛们应该很熟悉,也常用哈. 这是垂直的滚动条视图哈 一起来用吧! android:layout_widt ...

  5. android+布局分块,android的List View的Item布局问题

    线性布局,你的第一个textview已经设成占满整个空间了,你的中.右布局当然出不来了,姑且认为你左中右三块平均分配水平空间,可以这么写 android:layout_width="matc ...

  6. android布局翻译,android – 使用翻译动画将视图从一个布局转换为另一个布局

    我是 Android动画的新手,我的要求是在点击该视图时将视图从一个布局转换为单个xml文件中的布局. 场景: 假设我单击一个按钮,它出现在xml文件中标题的顶部,它应该向下移动/转换(它应该会产生一 ...

  7. Android布局中 android:layout_gravity=bottom为何不起作用?

    在android布局时我们有时会需要将位于LinearLayout布局中的控件放在布局底部,或者是同时想将几个控件底部对齐,此时我们自然会想到使用 android:layout_gravity=&qu ...

  8. android+布局倾斜,android – 如何在Eclipse图形布局视图中使斜...

    在Eclipse中工作,我试图将一些斜体文本放到布局上.问题是,当我设置时 android:textStyle ="italic",文字消失. (内容的高度变为0,整个TextVi ...

  9. 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码

    自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...

最新文章

  1. 关于 Python 3.9,那些你不知道的事
  2. oracle job定时报错,Oracle Job定时任务的使用详解
  3. Python版——博客网站九 编写Android版本的移动App
  4. 【windows下进程searchfilterhost.exe分析】
  5. 通过按Enter阻止用户提交表单
  6. 2016年9月ccf
  7. [转]飞秋使用说明与常见问题解决方法
  8. Android版添加phonegap--美洽客服插件教程
  9. 笔记本电脑只能外放,插上耳机还是外放
  10. Docker 常用命令收录 -- 持续更新
  11. 不论微信钉钉还是什么软件,我写了个通用的消息监控处理机器人
  12. VS2019登录不上
  13. OSPF基本配置及手动修改路由器优先级
  14. Python之私有属性和私有方法
  15. Nsight system(nsys)
  16. paddlepaddle 7 面向语义分割的迁移学习
  17. 全自动一键签到v1.0小工具
  18. 从火灾演习中认识火灾以及火灾发生时如何确保消防设备的正常运行
  19. 3 大算法,奠定 LoRa 地理定位
  20. matlab在振动信号处理中的应用,关于《matlab在振动信号处理中的应用》

热门文章

  1. Linux怎样创建.log文件,列数Linux下几种创建文件的方式
  2. 团队管理26--任务执行之过程管理
  3. 热门智能手表!OPPO华为苹果强强对决,哪款值得买?
  4. MybatisPlusException: Error: GlobalConfigUtils setMetaData Fail
  5. hihocoder编程练习赛73 A 地铁站
  6. Appium配置华为鸿蒙系统
  7. 全志V3S荔枝派zero10分钟制作TF启动卡,主线Linux,主线u-boot(超过10分钟博主直播吃奥利奥!!!)
  8. 杰理之ANC治具参数设置【篇】
  9. 实拍当贝F5与坚果J10S,莫要听信网上水军
  10. python如何实现任务超时处理?