MeasureSpec的理解
从单词的名字上看貌似“测量规格”或者“测量说明书”这一类,不管怎么说,它是一种会影响View的规则,随意,如果我们要测量View的大小就必须要弄懂它
三种类型
1. UNSPECIFIED
父容器不对View有任何限制,要多大就给多大,这种模式一般用于系统内部,标志是一种测量状态。
2. EXACTLY
父容器已经检测出View所需要的精确大小,这个时候View的最终打消就是SpecSize所指定的值,它对英语LayoutParams中的match_parent和具体数值这两种模式。
3. AT_MOST
父容器指定了一个可用大小即 SpecSize, View 的大小不能大于这个值,具体是什么要看View的具体实现,对英语LayoutParams里面的warp_content。
简要总结
对于一个普通的View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来共同决定,那么对于不通的父容器和View本身不通的LayoutParams,View就有多种MeasureSpec:
- 当View采用固定宽高的时候,父容器不管是什么,View的MeasureSpec都是精确模式,并且其大小遵循LayoutParams中的大小;
- 当View的宽高是match_parent的时候,如果父容器是精准模式,那么View也将是精准模式,并且大小是父容器的剩余大小,如果父容器是最大模式,那么View也会是最大模式,并且大小不会超过父容器的剩余大小;
- 当View的宽高是warp_content的时候ioyu,不管父容器的模式是精准还是最大化,View的模式总是最大化并且大小不能超过父容器的剩余空间;
- 我们分析中遗漏了UNSPECIFIED模式,那是因为这个模式主要用于系统内部多次Measure的情形,一般来说我们不需要关注