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的工作过程简介的更多相关文章

  1. Android自定义View4——统计图View

    1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...

  2. SSH工作过程简介和SSH协议算法集简介

    SSH简介 SSH是Secure Shell(安全外壳)的简称,是一种在不安全的网络环境中,通过加密机制和认证机制,实现安全的远程访问以及文件传输等业务的网络安全协议. SSH协议采用了典型的客户端/ ...

  3. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

  4. 【Android - 自定义View】之View的measure过程解析

    measure(测量)过程是View的工作流程中最开始.最核心的过程,在这个过程中负责确定View的测量宽/高. 对于View和ViewGroup,measure过程有不同的执行方法:如果目标是一个原 ...

  5. Android自定义View

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于Android自定义View ...

  6. Android自定义View之ProgressBar出场记

    关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记.android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检 ...

  7. android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

    我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...

  8. 教你搞定Android自定义View

    Android App开发过程中,很多时候会遇到系统框架中提供的控件无法满足我们产品的设计需求,那么这时候我们可以选择先Google下有没有比较成熟的开源项目可以让我们用,当然现在Github上面的项 ...

  9. Android 自定义View之BounceProgressBar

    之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了 ...

随机推荐

  1. Linux 编译与交叉编译

    在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文 ...

  2. 通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

  3. 医生智能提醒小程序数据库设计心得——Legends Never Die

    数据库设计心得 根据我们小组数据库设计的整个流程,我们将整个数据库设计划分为两个具体的阶段,在每个阶段需要进行不同的准备,有不同的注意事项,接下来我们将结合在数据库设计过程中遇到的一些问题和困难,提出 ...

  4. AXI4-Stream协议总结与分析

    一.协议介绍 1.AXI4_Stream:适用于高速数据流,去掉了地址项,允许无限制的数据突发传输.除了总线时钟和总线复位,其他的接口信号都是以字母T开头. 2.信号接口描述: (1).ACLK--- ...

  5. Python实现定时发送邮件代码

    mailtools.py代码如下: # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2017/12/22 17:50 # @Desc : ...

  6. C语言程序设计100例之(8):尼科彻斯定理

    例8    尼科彻斯定理 题目描述 尼科彻斯定理可以叙述为:任何一个整数的立方都可以表示成一串连续的奇数的和.需要注意的是,这些奇数一定是连续的,如:1,3,5,7,9,…. 例如,对于整数5,5*5 ...

  7. ReactJS的4行代码

    Angular 2一个显著的变动是,把Angular 1的Promise pattern改成了Observer pattern,并且使用了ReactJS.这里有一篇值得一读的文章 要搞懂ReactJS ...

  8. nyoj 268-荷兰国旗问题 (count)

    268-荷兰国旗问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:20 难度:1 题目描述: 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干 ...

  9. mysql数据库如何赋予远程某个IP 访问权限

    1.授权用户root使用密码jb51从任意主机连接到mysql服务器: 代码如下: GRANT ALL PRIVILEGES ON *.* TO 'ROOT'@'%' IDENTIFIED BY 'j ...

  10. MySQL/MariaDB读写分离配置

    DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力:数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作.实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的mys ...