Android MeasureSpec的理解和源码的解析.

MeasureSpec

MeasureSpec的创建规则:

关于MeasureSpec的理解

(1) MeasureSpec基础知识

MeasureSpec通常翻译为"测量规格",它是一个32位的int数据.其中高2位代表SpecMode即某种测量模式,低30位为SpecSize代表在该模式下的规格大小.可以通过:

int specMode = MeasureSpec.getMode(measureSpec) 获取specMode
               int specSize = MeasureSpec.getSize(measureSpec) 获取SpecSize

常用的SpecMode有三种:

MeasureSpec.EXACTLY

官方文档:Measure specification mode: The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be.

父容器已经检测出子View所需要的精确大小.该子View最终的测量大小即为SpecSize.

(1) 当子View的LayoutParams的宽(高)采用具体的值(如100px)时且父容器的MeasureSpec为 MeasureSpec.EXACTLY或者.MeasureSpec.AT_MOST或者MeasureSpec.UNSPECIFIED时:系统返回给该子View的specMode就为MeasureSpec.EXACTLY.系统返回给该子View的specSize就为子View自己指定的大小(childSize)

通俗地理解:
  子View的LayoutParams的宽(高)采用具体的值(如100px)时,那么说明该子View的大小是非常明确的,明确到已经用具体px值指定的地步了.那么此时不管父容器的specMode是什么,系统返回给该子View的specMode总是MeasureSpec.EXACTLY,并且系统返回给该子View的specSize就为子View自己指定的大小(childSize).

(2) 当子View的LayoutParams的宽(高)采用match_parent时并且父容器的MeasureSpec为 MeasureSpec.EXACTLY时:
    系统返回给该子View的specMode就为 MeasureSpec.EXACTLY
    系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
    通俗地理解:
    子View的LayoutParams的宽(高)采用match_parent时并且父容器的MeasureSpec为 MeasureSpec.EXACTLY.这时候说明子View的大小还是挺明确的:就是要和父容器一样大,更加直白地说就是父容器要怎样子View就要怎样.所以,如果父容器MeasureSpec为 MeasureSpec.EXACTLY那么:系统返回给该子View的specMode就为 MeasureSpec.EXACTLY,和父容器一样.
系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize),就是父容器的剩余大小.同样的道理如果此时,MeasureSpec为 MeasureSpec.AT_MOST呢?系统返回给该子View的specMode也为 MeasureSpec.AT_MOST,和父容器一样.
 系统返回给该子View的specSize也为该父容器剩余空间的大小(parentLeftSize),就是父容器的剩余大小.

MeasureSpec.AT_MOST
 官方文档  The child can be as large as it wants up to the specified size.
 父容器指定了一个可用大小即specSize,子View的大小不能超过该值.
 (1) 当子View的LayoutParams的宽(高)采用match_parent时并且父容器的MeasureSpec为 MeasureSpec.AT_MOST时:
      系统返回给该子View的specMode就为 MeasureSpec.AT_MOST
      系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
      这种情况已经在上面介绍 MeasureSpec.EXACTLY时已经讨论过了.
 (2) 当子View的LayoutParams的宽(高)采用wrap_content时并且父容器的MeasureSpec为 MeasureSpec.EXACTLY时:
      系统返回给该子View的specMode就为 MeasureSpec.AT_MOST
      系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
      通俗地理解:

子View的LayoutParams的宽(高)采用wrap_content时说明这个子View的宽高不明确,要视content而定.
    这个时候如果父容器的MeasureSpec为 MeasureSpec.EXACTLY即父容器是一个精确模式;这个时候简单地说
      子View是不确定的,父容器是确定的,那么
       系统返回给该子View的specMode也就是不确定的即为 MeasureSpec.AT_MOST
      系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
 (3) 当子View的LayoutParams的宽(高)采用wrap_content时并且父容器的MeasureSpec为 MeasureSpec.AT_MOST时:
       系统返回给该子View的specMode就为 MeasureSpec.AT_MOST
       系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
       通俗地理解:

子View的LayoutParams的宽(高)采用wrap_content时说明这个子View的宽高不明确,要视content而定.
      这个时候如果父容器的MeasureSpec为 MeasureSpec.AT_MOST这个时候简单地说
    子View是不确定的,父容器也是不确定的,那么系统返回给该子View的specMode也就是不确定的即为 MeasureSpec.AT_MOST
 系统返回给该子View的specSize就为该父容器剩余空间的大小(parentLeftSize)
 MeasureSpec.UNSPECIFIED
 官方文档  The parent has not imposed any constraint on the child. It can be whatever size it wants.
 父容器不对子View的大小做限制.    一般用作Android系统内部,或者ListView和ScrollView.在此不做讨论.
 关于这个三种测量规格下面的源码分析中体现得很明显,也可参考以下附图.
 (2) 在onMeasure()时子View的MeasureSpec的形成过程分析关于该技术点的讨论,请看下面的源码分析.

Android MeasureSpec的理解和源码的解析相关推荐

  1. Android contacts 联系人 通讯录 源码 完全解析

    Android contacts 联系人 通讯录 源码 完全解析 1简介 2软件架构 3各功能模块分析 1联系人数据的显示 1联系人列表显示 2联系人详细信息数据的显示 2联系人数据的编辑和存储 1编 ...

  2. java handlerthread_深入Android HandlerThread 使用及其源码完全解析

    本篇我们将来给大家介绍HandlerThread这个类,以前我们在使用线程执行一个耗时任务时总会new一个Thread的线程去跑,当任务执行完后,线程就会自动被销毁掉,如果又由新的任务,我们又得新建线 ...

  3. android系统tts TextToSpeech源码原理解析及定制tts引擎

    TextToSpeech 即文字转语音服务,是Android系统提供的原生接口服务,原生的tts引擎应用通过检测系统语言,用户可以下载对应语言的资源文件,达到播报指定语音的文字的能力.但是一切都是在g ...

  4. Histograms of Oriented Gradients (HOG)理解和源码

    HOG descriptors 是应用在计算机视觉和图像处理领域,用于目标检测的特征描述器.这项技术是用来计算局部图像梯度的方向信息的统计值.这种方法跟边缘方向直方图(edge orientation ...

  5. Android setFocusableInTouchMode 方法使用和源码详解

    是什么 一般点击一个button,就会执行onclick 事件, 但是有些情况,我们想要点击button之后, 先获取焦点,然后再次点击一次,才执行onClick 事件.这时候,setFocusabl ...

  6. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  7. android lottie字体json,从json文件到炫酷动画-Lottie实现思路和源码分析

    从json文件到炫酷动画-Lottie实现思路和源码分析,Lottie是最近Airbnb开源的动画项目,支持Android.iOS.ReactNaitve三个平台,本文分析主要Lottie把json文 ...

  8. 解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  9. Zxing生成二维码思路和源码解析

    Zxing生成二维码思路和源码解析 本博文是一篇介绍google zxing包生成二维码的思路和它的源码的文章. 一.引入 如何调用zxing的代码生成一个二维码呢?主要的函数只有一个,如下所示: B ...

  10. 状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析

    文章大体就两部分: 状态模式 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理. ...

最新文章

  1. uni-app如何取消pages页面的默认返回按钮【autoBackButton属性】
  2. LeetCode 90子集Ⅱ91解码方法
  3. qdialog 返回值_python-PyQt QDialog返回响应是或否
  4. 云游戏之真心话:一切才刚刚开始 | 对话南京大学副教授马展
  5. 如何处理错误消息Query XXX is invalid or contains errors
  6. gson java 对象_Gson把json串转换成java实体对象
  7. Linux-kernel 网桥代码分析(一)
  8. 如果程序员面试时,大家都说真话会怎么样?画面过于真实....
  9. python股票_python股票 - 随笔分类 - 無碼 - 博客园
  10. 有限差分法的基本思想
  11. 吉他入门教程之吉他音阶训练——练习方法
  12. Redis之多实例的操作
  13. 百兆网线和千兆网线做法的区别
  14. spm12安装与使用
  15. 各种各样的分布函数-卡方分布
  16. ARM 指令 LDR
  17. Linux会产生磁盘碎片吗,Linux不需要磁盘整理:碎片的来源
  18. Keras深度学习实战(26)——文档向量详解
  19. supermap大赛用得到python吗_在pygraph中使用超图,需要验证示例
  20. Linux根目录下子目录的详解

热门文章

  1. Android项目(完整版+免费版)
  2. python3.7下载 numpy
  3. Vbs脚本编程简明教程之十五
  4. android全面屏系统哪个版本开始,屏幕类型全面屏(水滴屏)出厂系统内核Android9.0.PDF...
  5. 一加6android9玩飞车掉,解锁新速度:一加6T深度评测
  6. 电商系统之商品类目及商品属性史
  7. 一淘商品类目预测[转载]
  8. Mujoco编程开发-官方文档
  9. Houdini学习笔记
  10. vue H5 唤醒app