Android开发之onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法
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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
最新文章
- 利用python的双向队列(Deque)数据结构实现回文检测的算法
- ArcEngine 栅格数据
- Web页中table导出到execl(带模板)
- 下载文件的一种简单方法js
- 使用jQuery插件PrintArea进行html页面打印
- C#下丢掉.asmx文件的WebService的实现
- MySQL5.6多实例部署
- SAP 发送邮件 面向对象
- socket之解决粘包方法
- [HDU5663]Hillan and the girl
- DAO层设计Junit测试
- 记一次Dynamic Batching不生效的爬坑实例分析[Unity]
- YY:2018互联网创业公司应看清的事情
- vue 使用高德地图vue-amap组件
- 高级数据库技术SQL
- php pdo对象使用详解: 连接数据库与exec方法
- python之路----面向对象的继承特性
- SPA页面缓存再优化二
- 【Maven】安装及配置(Win)
- 使用Visual Studio Code编写和激活ABAP代码 (上)