自定义View的流程:
1:构造函数——(View初始化)
2:onMeasure——(测量View大小)
3:onSizeChanged——(确定View大小)
4:onLayout——(确定子View布局(自定义view包含子View时有用,决定View在viewGroup中的位置))
5:onDraw——(实际绘制内容)
6:提供接口——(控制View或者监听View的某些状态)
onMeasure():
而决定View的大小只需要两个值:宽详细测量值(widthMeasureSpec)和高详细测量值(heightMeasureSpec)。也可以把详细测量值理解为视图View想要的大小说明(想要的未必就是最终大小)。
对于详细测量值(measureSpec)需要两样东西来确定它,那就是大小(size)和模式(mode)。而measureSpec,size,mode他们三个的关系,都封装在View类中的一个内部类里,名叫MeasureSpec。
MeasureSpec使用了二进制去减少对象的分配
MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
MeasureSpec由size和mode组成
测量的模式有三种:
UNSPECIFIE、EXACTLY、AT_MOST
UNSPECIFIE:
父view没有对子view施加任何约束,子view可以使任意大小(也就是未指定大小)
(UNSPECIFIE在源码中的处理和EXACTLY一样,当view的宽度值设置为0的时候或者没有设置宽高时,模式为UNSPECIFIE)
EXACTLY:
父view决定子view的确切大小,子View被限定在给定的边界里,忽略本身想要的大小
(当设置width或者height为match_parent时,模式为EXACTLY,因为子view会占据剩余容器的空间,所以它的大小是确定的)
AT_MOST
子View最大可以达到指定的大小
(当设置warp_content时,模式为AT_MOST,表示子view的大小最多是多少,这样子view会根据这个上限来这是自己的尺寸)
Paint有三种模式:
Paint.Style.FILL——填充内部;
Paint.Style.FILL_and_STROKE——填充内部和描边
Paint.Style.STORKE——描边