在Android开发中往往需要根据需求对原生控件进行自定义,其中主要涉及到的就是onMeasure,onLayout和onDraw三个方法的重写与使用,其中onMeasure是其中最复杂的一个方法,很多程序员仅仅知道该方法用来测量大小,却不知道何时调用,如何去用,本文就对利用Linearlayout的源码来解析onMeasure.

1.何时调用onMeasure

onMeasure方法的作用时测量空间的大小,什么时候需要测量控件的大小呢?这个过程就同炒菜一样,在炒的时候你不需要考虑需要多少大小,只有你需要拿盘子装时,你才需要知道到底有多少菜,需要拿多大的盘子.

简单自定义Layout,和View并打出Log如下:

由上图可以看出调用先后顺序是先调用父容器的onMeasure后调用View的onMeasure,实际上控件在创建时不需要知道大小,只需要先创建出在放入父容器时,父容器需要知道View大小时才去测量View的大小,接下来从源码来分析整个过程.

2.源码分析onMeasure调用

我们从LinearLayout的onMeasure为入口,开始分析整个过程:
到这里先说明一下widthMeasureSpec和heightMeasureSpec这两个参数,两者实际是一样的,我们就用前者来说明,widthMeasureSpec用int值来表示,这个值由高32位和低16位组成,高32位保存的值叫specMode,可以通过如代码中所示的MeasureSpec.getMode()获取;低16位为specSize,同样可以由MeasureSpec.getSize()获取

specMode组成与具体意义:

这里就不过多解释,如果需要深入的同学请自行百度官方文档说明.
接下来跟进看measureVertical方法,整个方法都在测量垂直方向的最终高度的值,该方法具体代码较长下面就展示关键代码:

上面代码外面还有一个For循环包裹,循环次数是子View的数量,我们主要分析的事onMeasure的调用过程所以我们就不仔细解释代码,这里我们直接看measureChildBeforeLayout方法:
最后实际调用的是getChildMeasureSpec方法获得View的宽和高的spec,最后调用View的measure方法,这里我们先看getChildMeasureSpec方法:

这个方法传入三个参数,分别是ViewGroup的spec,可利用的最大宽度/高度,和View的宽度/高度,以上就是通过ViewGroup的model,view的宽度/高度综合比较最后生成一个spc.view的宽度/高度的值主要分三种情况-1表示match_parent,-2表示wrap_content,和具体数值(需要大于等于0),具体过程总结为下表(盗用一下别人的表格):
从这个表我们能看出来,当View没有具体大小时,其大小最后都与ViewGroup的大小一致,这也就解释了为什么自定义的View的wrap_content没有效果,View的大小不完全由其父View决定,还由自身的onMeasure方法决定.
最终利用MeasureSpec.makeMeasureSpec(resultSize, resultMode)生成一个int的spc,最后调用View的measure方法,将子View的spc传进去,下面我们看measure方法:
方法较长我们也不具体分析,看黄字部分,在这个方法最后调用了自身的onMeasure方法并将widthMeasureSpc传入,这也就是View中的onMeasure中两个参数的由来.
以上就是在自定义View是onMeasure方法的具体调用过程,由于我们分析的是过程所以没有具体分析实现,希望对大家理解整个过程又一定的帮助,有错误也请及时指出.

Android自定义控件之onMeasure详解相关推荐

  1. Android自定义控件进阶13-MotionEvent详解

    Android MotionEvent 详解,之前用了两篇文章 事件分发机制原理 和 事件分发机制详解 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家 ...

  2. android里的editText怎么用,Android自定义控件EditText使用详解

    本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下 自定义控件分三种: 1. 自绘控件 2. 组合控件 3. 继承控件 代码已上传到 github 以后的 ...

  3. Andoid自定义View的OnMeasure详解和自定义属性

    一,OnMeasure详解 Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情 ...

  4. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

  5. android默认exported_Android android:exported = true 用法详解

    Android android:exported = true 用法详解 Android相关属性的介绍:android:exported = true 在Activity中该属性用来标示:当前Acti ...

  6. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

  7. Android中mesure过程详解 (结合Android 4.0.4 最新源码)

    如何遍历并绘制View树?之前的文章Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)中提到invalidate()最后会发起一个View树遍历的请求,并通 ...

  8. Android中layout过程详解 (结合Android 4.0.4 最新源码)

    上一篇文章Android中mesure过程详解 (结合Android 4.0.4 最新源码)介绍了View树的measure过程,相对与measure过程,本文介绍的layout过程要简单多了,正如l ...

  9. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

最新文章

  1. percona-5.5安装笔记
  2. (亲试有效)如何完美更换WordPress网站的域名
  3. 20201014 《人工智能与大数据》第1节课 笔记
  4. python函数参数定义顺序_Python函数定义-位置参数-返回值
  5. 审计某开源商城中的漏洞大礼包
  6. 云计算论文集, Spark, 数据描述语言, 运维工具集
  7. 要么干,要么滚,千万别混
  8. MySQL—用户和权限管控
  9. Getting started with Bitcoin
  10. WiredTiger存储引擎知多少?
  11. Spring Boot项目在GitHub上初始化及控管步骤
  12. 程序员修炼之道:从小工到专家
  13. 团队成立——Microhard
  14. WeOpen Talk|张亮:正确理解开源的意义,迸发开源潜力
  15. matlab counter是什么意思,counter-propagating是什么意思
  16. 自定义刻度尺进度条总结
  17. MATLAB绘图笔记——画箱形图
  18. pandas的自带数据集_python数据分析万字干货!一个数据集全方位解读pandas
  19. 4pycharm与jupyter使用对比
  20. 【科创人独家】爱因互动洪强宁:参与创业≠创业,融到钱的那晚我失眠了

热门文章

  1. 关于核心系统日终扎帐控制外围系统当天未处理的业务
  2. Android测试框架
  3. H3C防火墙路由器做回流
  4. PyQT5线程:多线程(QThread),线程锁(QMutex)
  5. 顶级专家谈中国脑科学研究最新成果
  6. 逻辑右移和算术右移的区别
  7. YCM(YouCompleteMe)常用命令大全
  8. 7,xilinx 7系列FPGA理论篇——CMT时钟模块简介
  9. html如何设置词语距离,css文本间距怎么调?
  10. C++ string字符串分割