连接器,对应于VIEwRootImpl类作用
连接WindowManager 和 DecorVIEw
完成VIEw的三大流程: measure、layout、draw特别注意
// 在主线程中,Activity对象被创建后:// 1. 自动将DecorVIEw添加到Window中 & 创建VIEwRootImpll对象root = new VIEwRootImpl(vIEw.getContent(),display);// 3. 将VIEwRootImpll对象与DecorVIEw建立关联root.setVIEw(vIEw,wparams,panelParentVIEw)
1.2 DecorVIEw定义:顶层VIEw作用:显示 & 加载布局即 AndroID 视图树的根节点;同时也是 FrameLayout 的子类
特别说明VIEw层的事件都先经过DecorVIEw,再传递到VIEw
内含1个竖直方向的linearLayout,分为2部分:上 = 标题栏(Titlebar)、下 = 内容栏(content)
在Activity中通过 setContentVIEw()所设置的布局文件其实是被加到内容栏之中的,成为其唯一子VIEw =
ID为content的FrameLayout中
// 在代码中可通过content得到对应加载的布局// 1. 得到contentVIEwGroup content = (VIEwGroup)findVIEwByID(androID.R.ID.content);// 2. 得到设置的VIEwVIEwGroup rootVIEw = (VIEwGroup) content.getChildAt(0);
1.3 Window、Activity、DecorVIEw 与 VIEwRoot的关系简介之间的关系二. 绘制准备回忆上图,可看出最后1步 = 绘制
但在绘制前,系统会有一些绘制准备,即前面几个步骤:创建
PhoneWindow
类、DecorVIEw
类、VIEwRootmpl
类等。主要包括:DecorVIEw
创建 & 显示三. 绘制流程概述从上可知,VIEw
的绘制流程开始于:VIEwRootImpl
对象的performTraversals()
源码分析
/** * 源码分析:VIEwRootImpl.performTraversals() */ private voID performTraversals() { // 1. 执行measure流程 // 内部会调用performMeasure() measureHIErarchy(host, lp, res,desireDWindowWIDth, desireDWindowHeight); // 2. 执行layout流程 performlayout(lp, mWIDth, mHeight); // 3. 执行draw流程 performDraw(); }
从上面的performTraversals()
可知:VIEw的绘制流程从顶级VIEw(DecorVIEw)
的VIEwGroup
开始,一层一层从VIEwGroup
至子VIEw遍历测绘绘制的流程 = measure过程、layout过程、draw过程,具体如下:下面,我将详细讲解VIEw绘制的三大流程:即:自上而下遍历、由父视图到子视图、每一个 VIEwGroup 负责测绘它所有的子视图,而最底层的 VIEw 会负责测绘自身
measure
过程、layout
过程、draw
过程四. 详细介绍4.1 Measure 过程作用测量VIEw的宽 / 高
具体流程1.在某些情况下,需要多次测量(measure)才能确定VIEw最终的宽/高;
2.该情况下,measure过程后得到的宽 / 高可能不准确;
3.此处建议:在layout过程中onLayout()去获取最终的宽 / 高
4.2 Layout过程作用
计算视图(VIEw)的位置
具体流程即计算VIEw的四个顶点位置:left、top、Right 和 Bottom
4.3 Draw过程
作用
绘制VIEw视图
具体流程
至此,关于VIEw
的工作流程讲解完毕。点赞收藏分享文章举报手指尖的按恋发布了83 篇原创文章 · 获赞 37 · 访问量 5万+私信 关注 总结 以上是内存溢出为你收集整理的Android的View体系(六):梳理总结View绘制的全流程全部内容,希望文章能够帮你解决Android的View体系(六):梳理总结View绘制的全流程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)