【Android - 自定义View】之View的工作过程简介
View的工作过程分为三个过程:
- View的measure过程;
- View的layout过程;
- View的draw过程。
我们知道,一个Activity就是一个窗口,这个窗口中包含一个Window、一个DecorView和一个ViewRootImpl对象,而应用中的所有Window都由一个WindowManager对象管理。ViewRootImpl是连接WindowManager和DecorView的纽带,它可以接受WindowManager传过来的消息,将消息传递给DecorView,DecorView再将消息进行分发。另外,View的三大流程(测量、布局和绘制流程)也都是在ViewRootImpl中完成的。
ViewRootImpl中有一个 performTraversals() 方法,在这个方法中会依次调用 performMeasure() 、 performLayout() 、 performDraw() 三个方法,这三个方法分别完成DecorView的measure、layout和draw这三大流程。在performMeasure()方法中会调用 measure() 方法,在measure()方法中又会调用 onMeasure() 方法;在onMeasure()方法中则会对所有子元素进行measure过程,这个时候measure流程就从父容器传递到子元素中,这样就完成了一次measure过程。接着,子元素会重复父元素的measure过程,这样反复就完成了整个View Treee的遍历。同理,performLayout()方法和performDraw()方法的流程和performMeasure()方法的流程是类似的。整个流程如下图所示。

DecoreView是整个Activity中的顶层布局,这个布局默认是一个垂直排列的LinearLayout,上面一部分叫做标题栏,下面一部分叫做内容区域,如下图所示。可以看出,这张图就是我们使用默认主题运行Android程序时显示的界面架构。其中,内容区域叫做 content ,我们可以通过 ViewGroup content = (ViewGroup) findViewById(android.R.id.content) 的方式找到这个content布局,这个布局就是放置我们项目XML文件中编写的界面布局的。因此,我们在Activity中都是使用 setContentView() 方法设置界面的布局,而不是使用setView()或者setLayout()。

再回来介绍View的三大流程:
measure 过程决定了View的宽/高。measure完成之后,我们可以通过 getMeasuredWidth() 、 getMeasuredHeight() 方法获取到View测量后的宽度和高度。特别说明,这里后的的宽高是测量后的宽高,不是View实际的宽高。关于measure过程的具体流程请参考:【measure过程解析】。
layout 过程决定了View四个顶点的坐标和View的实际宽/高。layout完成之后,我们可以通过 getTop() 、 getBottom() 、 getLeft() 和 getRight() 四个方法获取View的四个边界的位置,也可以通过 getWidth() 和 getHeight() 方法来获取View的最终宽/高。关于layout过程的具体流程请参考:【layout过程解析】。
draw 过程决定了View的显示。只有在draw完成之后,View才能呈现在屏幕上。关于draw过程的具体流程请参考:【draw过程解析】。
【Android - 自定义View】之View的工作过程简介的更多相关文章
- Android自定义View4——统计图View
1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...
- SSH工作过程简介和SSH协议算法集简介
SSH简介 SSH是Secure Shell(安全外壳)的简称,是一种在不安全的网络环境中,通过加密机制和认证机制,实现安全的远程访问以及文件传输等业务的网络安全协议. SSH协议采用了典型的客户端/ ...
- Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...
- 【Android - 自定义View】之View的measure过程解析
measure(测量)过程是View的工作流程中最开始.最核心的过程,在这个过程中负责确定View的测量宽/高. 对于View和ViewGroup,measure过程有不同的执行方法:如果目标是一个原 ...
- Android自定义View
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于Android自定义View ...
- Android自定义View之ProgressBar出场记
关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记.android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检 ...
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...
- 教你搞定Android自定义View
Android App开发过程中,很多时候会遇到系统框架中提供的控件无法满足我们产品的设计需求,那么这时候我们可以选择先Google下有没有比较成熟的开源项目可以让我们用,当然现在Github上面的项 ...
- Android 自定义View之BounceProgressBar
之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了 ...
随机推荐
- 数据存储之非关系型数据库存储----MongoDB存储
MongoDB存储----文档型数据库 利用pymongo连接MongoDB import pymongo client = pymongo.MongoClient(host='localhost', ...
- Web for pentester_writeup之SQL injections篇
Web for pentester_writeup之SQL injections篇 SQL injections(SQL注入) Example 1 测试参数,添加 and '1'='1, 'and ' ...
- Apache+Tomcat负载均衡
参考:http://www.cnblogs.com/fly_binbin/p/3881207.html 反向代理负载均衡 (Apache2+Tomcat7/8) 使用代理服务器可以将请求转发给内部的 ...
- 大数据之路day01_1--Java下载、安装等配置
从今天开始,我就正式的走上大数据的道路了,如果说我为啥要去学习大数据,可能我的初衷是以后可以接触到人工智能方面的技术,后来在自学的过程中发现,学习人工智能,需要扎实的算法,以及对大量数据的处理,再者, ...
- NOIP 模拟22
这次考试真的是像教练说的真的挺难的,但是人家rank1还是100+, 但是咕咕蛊!
- canvas线条实践之运动的正方形
原理说明: 1.通过rect实现正方形的绘制: 2.save保存canvas面板的保存,restore回复保存的canvas面板到初始状态: 3.translate用于改变canvas坐标的起始位置: ...
- C语言I博客作业08
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业 我在这个课程的目标是 熟悉使用while和do-while结构解决问题 这个作业在那个具体方面帮助我实现目标 pta题目及查找的资料 ...
- 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下
Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda ...
- [.NET] 常用的reusable library
1. NAudio NAudio is an open source .NET audio and MIDI library, containing dozens of useful audio re ...
- API网关在API安全性中的作用
从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...