【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
之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了 ...
随机推荐
- 2018.8.3 python中的set集合及深浅拷贝
一.字符串和列表的相互转化 之前写到想把xx类型的数据转化成yy类型的数据,直接yy(xx)就可以了,但是字符串和列表的转化比较特殊,相互之间的转化要通过join()和split()来实现. 例如: ...
- mybatis代理机制讲解
问题描述 在使用Mybatis开发中,或者和Spring整合中,在Dao层中的Mapper接口与xml中的sql对应着,在service中直接调用Dao中的方法就可以直接访问sql.如下所示: /** ...
- 是true还是false呢?
古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...
- ie浏览器兼容性的入门解决方案
IE浏览器的兼容性素来是令人头疼的问题,大名鼎鼎的FUCK-IE不是浪得虚名的. 这里使用的解决方案是HACK,具体原理就是针对不同的浏览器写不同的HTML.CSS样式,从而使各种浏览器达到一致的渲染 ...
- 使用客户机和主机做DNS服务正向解析及小问题解决
1.下载yum包 命令:yum install bind-chroot 2.更改配置文件 在这里,要了解到主配置文件为: /etc/named.conf 但是,为了避免经常修改主配置文件named ...
- PHP-PSR 现代PHPer的开发规范
PSR是PHP Standards Recommendation的简称,意为PHP推荐标准.要想了解PSR,首先得知道制定这一标准的人/组织是谁————PHP-FIG. PHP-FIG PHP-FIG ...
- JDBC事务的简单使用
在实际功能当中,经常会碰到同时对一组数据进行增加和减少,最常见的就是交易功能. 事务内执行的语句,要么都成功,要么都失败,如果有一句没执行成功,整个事务都不会提交的. import java.sql. ...
- 力扣(LeetCode)亲密字符串 个人题解
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...
- systemd单元文件
前面我们提到过systemd启动可以对相相互依赖的串行的服务,也是可以并行启动的.在systemd中使用单元替换init的脚本来进行系统初始化.这节将要介绍系统初始化中,作为systemd的最小单元, ...
- C# 彻底搞懂async/await
前言 Talk is cheap, Show you the code first! private void button1_Click(object sender, EventArgs e) { ...