Android自定义View和ViewGroup知识点汇总

一、View的绘制流程

onMeasure()->onDraw()。

二、ViewGroup的绘制流程

onMeasure()->onLayout()->onDraw()(一般不重写)。

三、需要重写的函数

View:必须重写onDraw来绘制图形,不一定要重写onMeasure,需要定义wrap_content时才需要重写onMeasure。

ViewGroup:必须重写onLayout函数,必须重写onMeasure函数,在onMeasure中必须调用measureChildren函数(否则子view布局中定义的宽高无效)。ViewGroup的onMeasure函数继承自View,ViewGroup本身没有调用过measureChildren,所以我们必须重写ViewGroup的onMeasure函数。

四、View的onMeasure作用

获取父布局给的宽高Mode和Size,最终调用setMeasureDimension(width,height)来设置它自己测量的宽高(并不是最终展示出的宽高)。

五、ViewGroup的onMeasure作用

获取父布局给的宽高Mode和Size,最终调用setMeasureDimension(width,height)来设置它自己测量的宽高(并不是最终展示出的宽高),同时要调用measureChildren函数来测量子View的宽高。

六、ViewGroup的onLayout作用(重点)

这个函数必须重写,用来定义子View的位置及宽高。需要遍历子View,依次调用子View的layout(l,t,r,b)来进行布局。其中l表示左边相对parent的最左边的距离,t表示顶部相对parent的顶部的距离,r表示最右边相对parent最左边的距离,b表示询问相对parent顶部的距离。即坐标系的原点是parent的左上角。一般r=l+getMeasureWidth(),b=t+getMeasuredHeigth()。这个getMeasuredWidth()就是onMeasure函数测量的值,getMeasuredHeigth同理。所以onMeasure函数测量的宽高并不是最终的宽高,View或ViewGroup位置及宽高是由父容器的onLayout函数决定的。

七、getWidth()与getMeasuredWidth()的区别

只有当前View或ViewGroup()的layout()函数被调用了之后,getWidth()(getHeigth())才能获取正确的值。

只有当前View或ViewGroup()的setMeasuredDimenstion()函数被调用了之后,getMeasuredWidth()(getMeasuredHeight())才能获取到正确的值。

你可能感兴趣的:(Android)