我们按照这个绘制流程来学习:
- xml布局文件的解析
- 测量onMeasure
- 布局onLayout(ViewGroup)
- 绘制onDraw
onMeasure 测量
父View模式 | 父View宽高 | 子View设置宽高 | 子View测量宽高 | 子View测量模式 |
---|---|---|---|---|
EXACTLY | 父View大小是确切的,例如(100,200) | 子View </br>(match_parent,match_parent) | (100,200) | EXACTLY |
EXACTLY | 父View大小是确切的,例如(100,200) | 子View(200,100) | 子View的测量大小就是(200,100),只是绘制展示后超不部分被遮挡 | EXACTLY |
EXACTLY | 父View大小是确切的,例如(100,200) | 子View</br>(wrap_content,wrap_content) | 子View大小不确定,暂定父View的大小(100,200),最大不能超过父View大小 | AT_MOST |
---- | -------------- | ------------ | ----------- | ----------- |
AT_MOST | 父View大小不确定,父View是Match或Wrap,但是其父View也给它设置了一个最大值,就是MeasureSpec 的size,大小不能超过这个最大值,父View(size,size) | 子View(match_parent,match_parent) | 子View填充父View,所以(size,size),大小不能超过size | AT_MOST |
AT_MOST | 父View大小不确定,父View是Match或Wrap,但是其父View也给它设置了一个最大值,就是MeasureSpec 的size,大小不能超过这个最大值,父View(size,size) | 子View(200,100) | 子View的测量大小就是(200,100),只是绘制展示后超不部分被遮挡 | EXACTLY |
AT_MOST | 父View大小不确定,父View是Match或Wrap,但是其父View也给它设置了一个最大值,就是MeasureSpec 的size,大小不能超过这个最大值,父View(size,size) | 子View(wrap_content,wrap_content) | 子View大小不确定,暂定父View的大小(size,size),最大不能超过父View大小 | AT_MOST |
---- | -------------- | ------------ | ----------- | ----------- |
UNSPECIFIED | 父View大小未指定,表示没有任何束缚和约束,没有最大值限制,可以得到任意想要的大小 | 子View(match_parent,match_parent) | 因为父View大小未指定,想要多大就多大,所以match 父View没有任何意义 ,则宽高(0,0) | AT_MOST |
UNSPECIFIED | 父View大小未指定,表示没有任何束缚和约束,没有最大值限制,可以得到任意想要的大小 | 子View(200,100) | 子View的测量大小就是(200,100),只是绘制展示后超不部分被遮挡 | EXACTLY |
UNSPECIFIED | 父View大小未指定,表示没有任何束缚和约束,没有最大值限制,可以得到任意想要的大小 | 子View(wrap_content,wrap_content) | 子View大小不确定,暂定等于父View的大小,父View的大小没指定,所以宽高没意义(0,0) | AT_MOST |