View绘制原理(时序图)

1.View绘制原理(时序图):
1.1.Android 系统View 的填充过程:
参见: ViewInflate.bmp:
View绘制原理(时序图)
1.2.onMeasure->onLayout->onDraw的过程.
参见: performTraversals.bmp:
View绘制原理(时序图)
View的Measure.bmp:
View绘制原理(时序图)
-> View的Layout.bmp:
View绘制原理(时序图)
-> View的Draw.bmp:
View绘制原理(时序图)
1.2.1.Measure过程的几点总结:
1.measure是final的,所以不能重写,如果自定义view可以通过重写onMeasure实现自定义measure;
2. 子布局的大小是由父布局和子布局共同决定的;后附有父布局和子布局规格对应关系表
3. 使用view的getMeasureWidth或getMeasureHeight方法,需要在view的onMeasure执行后;
4. viewgroup中有measureChildren,measureChild,measureChildwithMargin方法;
5. 只要是ViewGroup的子类, 它的Layoutparam需要继承marginlayoutparams,否则layout_margin不起作用;
6. DecorView的measure是在ViewRootImpl类中测量的,layoutparams的宽高均为
MATCH_PARENT,mode是EXACTLY,size为屏幕的大小。
View绘制原理(时序图)
1.2.2.Layout的几点总结:
1.View的layout可以被重写,ViewGroup的layout是final不能被重写,onlayout是抽象的,如果要自定义一个viewgroup的话,就必须重写onlayout方法;
2.使用View的getWidth()和getHeight()方法必须是在onLayout流程之后调用才返回有效值;
3. Layout操作完成后分配的四个方向的值都是相对于父布局的;
4.凡是layout_XX这样的属性都是针对的包含该子View的viewgroup的,对一个没有父布局的view设置layout_XX属性没有任何意义。
1.2.3.Draw的几点总结:
1.如果View是一个ViewGroup, 那么需要遍历的绘制所有子view;
2.View类默认不绘制内容,均由子类来绘制;
3.View的绘制借助onDraw方法传入Canvas类的对象来完成的。