您的位置:首页 > 移动开发 > Android开发

android View绘制流程

2016-01-08 10:17 344 查看
转自: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 (硬件绘制内容)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: