View
是 Android
开发者必须了解的基础View
原理的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化等等View
的原理,我能保证这是市面上的最全面、最清晰、最易懂的
- 本文秉着“结论先行、详细分析在后”的原则,即先让你们感性认识,再经过理性分析从而理解问题;
- 因此,请各位读者先记住结论,再往下继续看分析;
- 文章较长,阅读须要较长时间,建议收藏等充足时间再进行阅读
定义 链接器,对应于ViewRootImpl
类android
做用bash
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)
复制代码
View
即
Android
视图树的根节点;同时也是FrameLayout
的子类布局
View
层的事件都先通过DecorView
,再传递到View
spa
LinearLayout
,分为2部分:上 = 标题栏(titlebar)
、下 = 内容栏(content)
在
Activity
中经过setContentView()
所设置的布局文件实际上是被加到内容栏之中的,成为其惟一子View = id为content的FrameLayout
中线程
// 在代码中可经过content获得对应加载的布局
// 1. 获得content
ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
// 2. 获得设置的View
ViewGroup rootView = (ViewGroup) content.getChildAt(0);
复制代码
之间的关系 3d
更加详细 & 具体的介绍,请看文章:Android自定义View基础:ViewRoot、DecorView & Window的简介code
了解自定义View流程前,需了解必定的自定义View基础,具体请看文章:(1)自定义View基础 - 最易懂的自定义View原理系列orm
回忆上图,可看出最后1步 = 绘制 cdn
但在绘制前,系统会有一些绘制准备,即前面几个步骤:建立PhoneWindow
类、DecorView
类、ViewRootmpl
类等
故,下面我会先将绘制前的准备,再开始讲绘制流程
DecorView
建立 & 显示,具体请看文章:Android自定义View绘制前的准备: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
遍历测绘即:自上而下遍历、由父视图到子视图、每个
ViewGroup
负责测绘它全部的子视图,而最底层的 View 会负责测绘自身
measure
过程、layout
过程、draw
过程,具体以下下面,我将详细讲解View
绘制的三大流程:measure
过程、layout
过程、draw
过程
View
的宽 / 高
- 在某些状况下,须要屡次测量
(measure)
才能肯定View
最终的宽/高;- 该状况下,
measure
过程后获得的宽 / 高可能不许确;- 此处建议:在
layout
过程当中onLayout()
去获取最终的宽 / 高
(View)
的位置即计算
View
的四个顶点位置:Left
、Top
、Right
和Bottom
请看文章:自定义View Layout过程 - 最易懂的自定义View原理系列(3)
做用 绘制View
视图
具体流程
至此,关于自定义View
的工做流程讲解完毕。
measure
过程、layout
过程、draw
过程)来看,若要实现自定义View
,根据自定义View的种类不一样(单一View
/ ViewGroup
),需自定义实现不一样的方法onMeasure()
、onLayout()
、onDraw()
,具体以下结合原理 & 实现步骤,若需实现1个自定义View,请看文章:手把手教你写一个完整的自定义View
本文全面总结自定义View
的原理。至此,关于自定义View
的绘制流程您应该很是熟悉了。关于自定义View
的其余文章:
(1)自定义View基础 - 最易懂的自定义View原理系列
(2)自定义View Measure过程 - 最易懂的自定义View原理系列
(3)自定义View Layout过程 - 最易懂的自定义View原理系列
(4)自定义View Draw过程- 最易懂的自定义View原理系列
接下来我将继续对自定义View的应用进行讲解,有兴趣的能够继续关注Carson_Ho的安卓开发笔记