自定义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也是如此;

 

 

自定义view SurfaceView

 

 

首先看下OnMeasure方法:

其中最重要的参数MeasureSpec,是一个32位int型,高2位是specMode,低30位是specSize;

 

三种specMode:

exactly:精准大小

At_most:不超过父类;

UNspecific:系统内部参数,可以不看;

 

通过父类的measureSpec来获取子类的size;

 

 

自定义view SurfaceView

 但是注意一点的是:AT_MOST它是和EXACTLY一样,所以要进行处理;处理如下:

 

也就是说在自定义view的XML中设置长宽为wrap_content是对应的mode就是At_most,所以出来的效果就是match_parent;因此在自定义View中改写OnMeasure方法,将AT_MOST时对应的长度设为一个默认值200dp之类的;

 

当specMode是AT_MOST,就自己定义一个对应的长宽;

自定义view SurfaceView

 

 

onlayout:用setFrame方法来确定view四个顶点位置(都是相对父布局的),以及getWidth和getHeight来确定view最后的高宽;

 

 

 

XML中,设置padding值失效,因为默认是不生效的,只能自己在onDraw中实现

 

 

自定义view SurfaceView