view的绘制流程:
onMeasure()方法说明:
第一步:performeasure():用于指定和测量layout中所有控件的宽高。
对于ViewGroup:先去测量里面的子孩子,然后根据子孩子的宽高,再来计算和指定自己的宽高。对于View:它的宽高是由自己和父布局决定的。
第二步:performLayout():用于摆放布局,for循环所有的子view,用child.layout()摆放childView
performLayout View - > layout() -> onLayout()
摆放子布局 for循环所有子view ,前提view不能设置 GONE 属性,然后调用 child.layout()
第三步:performDraw():用于绘制自己还有子view,对于ViewGroup先绘制自己的背景,for循环绘制子view调用子view的draw()方法,对于View绘制自己的背景,然后绘制自己显示的内容
View -> draw() - > drawBackground()画背景
onDraw(canvas);//画自己 ViewGroup默认不会调用
dispatchDraw(canvas);//画子view 不断的循环调用子view的draw()
思考问题:
1.如果要获取View的宽高:前提肯定是先需要调用测量方法,测量完毕才能获取宽高。
2.view的绘制流程是在onResume()之后才开始的(Activity的启动流程的源码)
3.addView setVisibility()等等对view进行修改的 都会调用 requestLayout()方法,重新走一遍view的绘制流程,但不一定是真个view都重新绘制,也有可能是某一部分重新绘制。
4.优化的时候,根据对源码的熟悉,在写代码的时候进行相对于的优化。
5.尽量避免布局嵌套。
网友评论