【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
之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了 ...
随机推荐
- vue引入css文件报错Unrecognised input
一个vue项目中用到了swiper插件,引入swiper.css时报错 显示引入的css文件Unrecognised input ,在文件的line4,column12 . 其实是引入位置不对,样式文 ...
- (Java) 模拟http请求调用远程接口
package com.vcgeek.hephaestus.utils; import java.io.BufferedReader; import java.io.IOException; impo ...
- MySQL批量插入的分析以及注意事项
目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不 ...
- 赤壁情:dp
首先这道题用到的3个新关键字大概讲一下: (我刚学会仅仅会瞎搞做题,欢迎大神补充) static:声明一个变量并清空.(不知道用不用时间,求解答) 具体用法:static 变量类型 变量名.如:sta ...
- 我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧
编程任务:1.我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置.听说你是个优秀的程序 ...
- redis 数据库主从不一致问题解决方案
在聊数据库与缓存一致性问题之前,先聊聊数据库主库与从库的一致性问题. 问:常见的数据库集群架构如何? 答:一主多从,主从同步,读写分离. 如上图: (1)一个主库提供写服务 (2)多个从库提供读服务 ...
- 使用客户机和主机做DNS服务正向解析及小问题解决
1.下载yum包 命令:yum install bind-chroot 2.更改配置文件 在这里,要了解到主配置文件为: /etc/named.conf 但是,为了避免经常修改主配置文件named ...
- 如何构建自己的 react hooks
我们组的前端妹子在组内分享时谈到了 react 的钩子,趁此机会我也对我所理解的内容进行下总结,方便更多的同学了解.在 React 的 v16.8.0 版本里添加了 hooks 的这种新的 API,我 ...
- dubbo分布式Service不可以创建Error creating bean with name 'XXXXXX'
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demoService' ...
- django_4:数据库1——django操作数据库
创建数据库记录(插入) 使用python3 manage.py shell(python3亲测好使) ipython3 manage.py shell(亲测不好使) 方式一. [root@centos ...