1. MeasureSpec
子控件通过MeasureSpec获取父控件的measure信息
MeasureSpec封装内容{mode,size}
1.mode的三种类型
类型 | 说明 | |
---|---|---|
UNSPECIFIED | 不对View大小做限制 | |
EXACTLY | 定值 | |
AT_MOST | 大小不可超过某数值 |
2.控件如何获取MeasureSpec
父控件调用控件的View.measure(widthMeasureSpec, heightMeasureSpec)
传递
1.当子控件是宽/高是定值,子控件的宽高与父控件无关,它的MeasureSpec是{EXACTLY, 定值}
2.当子控件是宽/高是MATCH_PARENT,子控件的宽高同父控件,子控件的MeasureSpec的mode同父控件,MeasureSpec的size为父控件的宽/高
3.当子控件是宽/高是WRAP_CONTENT,子控件的宽高与父控件相关,子控件的宽/高不能超过父控件的宽高,只有在父控件的mode是EXACTLY时,子控件与父控件的MeasureSpec的mode不同,子控件的mode是AT_MOST,MeasureSpec的size为父控件的宽/高
lp.width/lp.height\parentMeasueSepc | EXACTLY/size | AT_MOST/size | UNSPECIFIED/size |
---|---|---|---|
MATCH_PARENT | EXACTLY/(size-padding) | AT_MOST/(size-padding) | UNSPECIFIED/(size-padding) |
WRAP_CONTENT | AT_MOST/(size-padding) | AT_MOST/(size-padding) | UNSPECIFIED/(size-padding) |
定值 | EXACTLY/定值 | EXACTLY/定值 | EXACTLY/定值 |
3.相关代码
1.ViewGroup.getChildMeasureSpec
public static int getChildMeasureSpec(int spec, int padding, int childDimension)