android View绘制流程

原创
2015/04/22 05:30
阅读数 110

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  (硬件绘制内容)

http://blog.csdn.net/myarrow/article/details/16862215


这里自己把View绘制流程的大概过一遍,内容不是很清晰,只是自己记录,以后在扩展。如果有不对的地方,一起探讨。


展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部