onMeasure()函数由包含这个View的具体的ViewGroup调用,因此值也是由其ViewGroup中传入的。子类View的这两个参数widthMeasureSpec, heightMeasureSpec由ViewGroup中的layout_width,layout_height和padding以及View自身的layout_margin共同决定。权值weight也是尤其需要考虑的因素,有它的存在情况可能会稍微复杂点。

了解了这两个参数的来源,还要知道这两个值的作用。我们只取heightMeasureSpec作说明。这个值由高32位和低16位组成,高32位保存的值叫specMode,可以通过如代码中所示的MeasureSpec.getMode()获取;低16位为specSize,同样可以由MeasureSpec.getSize()获取。那么specMode和specSize的作用有是什么呢?要想知道这一点,我们需要知道代码中的最后一行,所有的View的onMeasure()的最后一行都会调用setMeasureDimension()函数的作用——这个函数调用中传进去的值是View最终的视图大小。也就是说onMeasure()中之前所作的所有工作都是为了最后这一句话服务的。

我们知道在ViewGroup中,给View分配的空间大小并不是确定的,有可能随着具体的变化而变化,而这个变化的条件就是传到specMode中决定的,specMode一共有三种可能:

MeasureSpec.EXACTLY:父视图希望子视图的大小应该是specSize中指定的。

MeasureSpec.AT_MOST:子视图的大小最多是specSize中指定的值,也就是说不建议子视图的大小超过specSize中给定的值。

MeasureSpec.UNSPECIFIED:我们可以随意指定视图的大小。

因此 在实际开发中只需如此:

作者:宋巍
链接:https://www.jianshu.com/p/9f33c6d43b1c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最新文章

  1. 利用python的双向队列(Deque)数据结构实现回文检测的算法
  2. ArcEngine 栅格数据
  3. Web页中table导出到execl(带模板)
  4. 下载文件的一种简单方法js
  5. 使用jQuery插件PrintArea进行html页面打印
  6. C#下丢掉.asmx文件的WebService的实现
  7. MySQL5.6多实例部署
  8. SAP 发送邮件 面向对象
  9. socket之解决粘包方法
  10. [HDU5663]Hillan and the girl
  11. DAO层设计Junit测试
  12. 记一次Dynamic Batching不生效的爬坑实例分析[Unity]
  13. YY:2018互联网创业公司应看清的事情
  14. vue 使用高德地图vue-amap组件
  15. 高级数据库技术SQL
  16. php pdo对象使用详解: 连接数据库与exec方法
  17. python之路----面向对象的继承特性
  18. SPA页面缓存再优化二
  19. 【Maven】安装及配置(Win)
  20. 使用Visual Studio Code编写和激活ABAP代码 (上)

热门文章

  1. CUDA程序计时
  2. AC日记——Tree poj 3237
  3. AC日记——Housewife Wind poj 2763
  4. js 路径改变时获取url参数
  5. Widows下利用OpenSSL生成证书
  6. 在eclipse使用map reduce编写word count程序生成jar包并在虚拟机运行的步骤
  7. 动态加载/删除css文件以及图片预加载
  8. java正则过虑字符
  9. can-i-win(好)
  10. 自定义PropertyGrid控件【转】