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绘制流程的大概过一遍,内容不是很清晰,只是自己记录,以后在扩展。如果有不对的地方,一起探讨。


更多相关文章

  1. android 耳机左右声道接反,软件如何修正
  2. android framework service开发原理,以震动模块为例进行讲解
  3. Android中安全退出程序的六种方法
  4. Android事件分发机制与嵌套导致触摸事件冲突的解决方案
  5. 设置android studio textview 的点击打开新activity页面方法
  6. Android中JSON解析细解及实例
  7. Android通过Termux安装scrapy遇到的问题和解决方法
  8. Ubuntu 编译Android若干错误及解决方法
  9. Android(安卓)Native 应用程序启动 Activity 的方法

随机推荐

  1. Android创建和删除桌面快捷方式
  2. Android(安卓)SQLite
  3. PopupWindow 适配 Android(安卓)7.0 、7.
  4. android 监听 USB 拔插广播消息
  5. Android在程序中动态生成控件,动态布局
  6. Android之高仿手机QQ图案解锁
  7. [Android(安卓)Pro] Notification的使用
  8. android 反编译必知-public.xml
  9. TableLayout
  10. Softap热点原理分析