自定义View(View的绘制流程二)

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:

  1. 当View采用固定宽高的时候,父容器不管是什么,View的MeasureSpec都是精确模式,并且其大小遵循LayoutParams中的大小;
  2. 当View的宽高是match_parent的时候,如果父容器是精准模式,那么View也将是精准模式,并且大小是父容器的剩余大小,如果父容器是最大模式,那么View也会是最大模式,并且大小不会超过父容器的剩余大小;
  3. 当View的宽高是warp_content的时候ioyu,不管父容器的模式是精准还是最大化,View的模式总是最大化并且大小不能超过父容器的剩余空间;
  4. 我们分析中遗漏了UNSPECIFIED模式,那是因为这个模式主要用于系统内部多次Measure的情形,一般来说我们不需要关注

你可能感兴趣的:(自定义View(View的绘制流程二))