转自:http://my.oschina.net/fengzi2014/blog/404875?p=1
1.由Activity启动-->onCrate-->setContentView 为源头
2.setContent实际调用的是 -->getWindow().setContentView(layoutResID); getWindow()返回 PhoneWindow 实例
3.查看Phonewindow。setContentView(layoutResID)方法:
首先 installDecor()初始DecorView和mContentParent控件 ,其中mContentParent是mDecor的子控件
然后 mLayoutInflater.inflate(layoutResID, mContentParent);
4.查看 mLayoutInflater.inflate方法 :解析xml构造view 然后 root.addView(temp, params); root实际为上面的mContentParent
5.查看viewGroup addView方法 ,这里以前我们大概知道该方法会触发屏幕重绘更新。具体看里面方法的内容,重点代码有:
requestLayout(); //
invalidate(true);//
6 查看view 的requestLayout()方法发现 主要是 mParent.requestLayout(); mParent最上级为DecorView,它的mParent是ViewRoot
这里我们就可以知道,所有的更新处理都是有ViewRootImpl处理了。
7。查看ViewRootImpl的requestLayout();方法内容 --->scheduleTraversals()--->TraversalRunnable()-->doTraversal()
--->performTraversals();
8。performTraversals() 方法内容很多 这里处理就该分析:
http://www.codekk.com/open-source-project-analysis/detail/Android/lightSky/%E5%85%AC%E5%85%B1%E6%8A%80%E6%9C%AF%E7%82%B9%E4%B9%8BView%20%E7%BB%98%E5%88%B6%E6%B5%81%E7%A8%8B
看代码的话主要分为 performMeasure(..), performLayout(..) ,performDraw(..)
performMeasure 实际执行 mView.measure(childWidthMeasureSpec, childHeightMeasureSpec);好的这个时候从父view开始的遍历开始了,这里怎么遍历就不作说明了,网上这块讲解比较完整。
performLayout 类似同样。这里的话会产生一个英文 performDraw()怎么将每个View的draw()方法调用后更新呢。下面继续探讨
9.看 draw(boolean fullRedrawNeeded) {。。}这块代码 到--->
attachInfo.mHardwareRenderer.draw(mView, attachInfo, this,
animating ? null : mCurrentDirty);
看博客:http://blog.csdn.net/myarrow/article/details/16862215 硬件绘制(Hardware Render)窗口流程
这里 HardwareRenderer的静态内部类GlRenderer。draw(..) 中的 DisplayList displayList = buildDisplayList(view, canvas); 然后drawDisplayList(..)
这里的话获取DisplayList既是和View。draw(..)向关联的。可以理解 View。draw()只是汇总屏幕绘制信息到DisplayList的过程。
最后找找到buildDisplayList中----> DisplayList displayList = view.getDisplayList(); 说明: DisplayList 为硬件绘制的信息。 cpu收集是的绘制信息,交给硬件(GPU)Canvas处理绘制
10.好的最终我们终于回到了 view.getDisplayList()方法,这里面对view绘制信息进行汇总,最后调用draw(canvas); canvas是这里定义 : final HardwareCanvas canvas = displayList.start(width, height);
他也是属于disPlayList(). 最后回顾一下draw() 是收集屏幕绘制信息的一部分,是由用户自定义的。
总结:先测量 performMeasure()所有的view ,然后 performLayout()为计算所有视图布局 ,最后 performDraw()更新屏幕绘画
参考博客:http://blog.csdn.net/myarrow/article/details/16862215 (硬件绘制内容)