自定义view SurfaceView
1.OnMeasure:测量view的宽/高
2.OnLayout:决定view的四个顶点位置,以及拿到View的实际宽/高
3.OnDraw:绘制view
View的绘制流程是从ViewRoot的performTraverse方法开始,依次调用measure。layout,draw,父类view通过measure方法来对所有的子View进行measure,从而将整个View树measure一遍;layout,draw也是如此;
首先看下OnMeasure方法:
其中最重要的参数MeasureSpec,是一个32位int型,高2位是specMode,低30位是specSize;
三种specMode:
exactly:精准大小
At_most:不超过父类;
UNspecific:系统内部参数,可以不看;
通过父类的measureSpec来获取子类的size;
但是注意一点的是:AT_MOST它是和EXACTLY一样,所以要进行处理;处理如下:
也就是说在自定义view的XML中设置长宽为wrap_content是对应的mode就是At_most,所以出来的效果就是match_parent;因此在自定义View中改写OnMeasure方法,将AT_MOST时对应的长度设为一个默认值200dp之类的;
当specMode是AT_MOST,就自己定义一个对应的长宽;
onlayout:用setFrame方法来确定view四个顶点位置(都是相对父布局的),以及getWidth和getHeight来确定view最后的高宽;
XML中,设置padding值失效,因为默认是不生效的,只能自己在onDraw中实现