ViewRoot对应ViewRootImpl类,它是连接WindowManager和DecorView的纽带。View的三大流程均是通过ViewRoot来完成的。在ActivtyThread中,当Activity创建完毕,会将DecorView添加到Window中,同时创建ViewRootImpl对象,并将ViewRootImpl和DecorView建立关联。
root = new ViewRootImpl(view.getContext(),display);
root.setView(view,wparams,panelParentView);
View的绘制流程是从ViewRoot的performTraversals开始的,它经过三大流程制作出View。流程如下图所示:
performMeasure调用了measuer方法,又调用了onMeasure方法对所以子元素测宽高,然后measure从父容器传递给了子容器,子容器又调用onMeasure方法,这样一直下去就遍历完了View树。然后Layout和Draw和上述流程类似,只是Draw的分发用的是DispatchDraw来完成的。
measure通过getMeasureWidth和getMeasureHeight获取View的宽和高,在大多数情况下它等于最终View的宽高。Layout过程决定了View的四个顶点的坐标和实际View的宽高。draw过程就是将View最终显示在屏幕上。
DecorView是顶级布局,最初始的布局,结构如下图:
我们所做的setContentView就是在这个R.id.content上设置布局,它是一个FrameLayout。
理解MeasureSpec
MeasureSpec参与了Measure测量View的尺寸。系统将View的LayoutParams根据一些规则转化为MeasureSpec。
MeasureSpec代表着以为32位的int值,高两位代表SpecMode,低三十位代表SpecSize,前者是测量模式,后者为这种测量模式下的规格大小。
MeasureSpec通过将SpecMode和SpceSize打包成一个int来避免过多的对象内存分配。
最后
最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
有需要的朋友可以点击:**Android面试资料**免费领取~
一起互勉~
片转存中…(img-d2tsM6Lg-1645094577569)]
一起互勉~