View的工作原理(一) 总览View的工作流程
View的工作原理(一) 总览View的工作流程
学习自
《Android开发艺术探索》
简书博主-丶蓝天白云梦
Overview
从本章开始,开始学习View的工作原理,包括View的 measure(测量)
layout(布局)
和 draw(绘制)
都将在本系列文章中学习到。
从ViewRootImpl开始
ViewRootImpl
是DecorView和WIndowManager之间的纽带,WindowsManager如果想要想DecorView中添加View或者从DecorView中移除View,都需要通过 ViewRootImpl
来实现。而且我们要学习的View的工作的流程也是从ViewRootImpl开始的。因为本人才疏学浅,对Widow和WidowManager相关的一些知识还是一知半解,这里也就不误导大家了。在这里大家只需要对ViewRootImpl有一个简单的认知即可。
大概了解了ViewRootImpl的作用之后,我们接着来看ViewRoomImpl类中的非常重要的方法: performTraversals
方法, 此方法经过 measure
layout
draw
三个过程将View正确的显示了出来。
- measure 过程是测量View大小的过程
- layout 过程是确定View在父View中的位置的过程
- draw 就是绘制View的过程
//...
if (!mStopped || mReportNextDraw) {
if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth()
|| mHeight != host.getMeasuredHeight() || contentInsetsChanged ||
updatedConfiguration) {
//...
// Ask host how big it wants to be
//执行measure
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
}
//...
if (didLayout) {
//执行layout
performLayout(lp, mWidth, mHeight);
//...
}
//....
if (!cancelDraw && !newSurface) {
if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
for (int i = 0; i < mPendingTransitions.size(); ++i) {
mPendingTransitions.get(i).startChangingAnimations();
}
mPendingTransitions.clear();
}
//执行draw
performDraw();
}
//...
三个方法的过程的执行方式类似,这里就拿 perforMeasure
方法举例。在 performMeasure
方法中会调用顶级 View (DecorView)的 measure
方法,在 measure
方法中又调用了 onMeasure
方法,到此顶级view的measure算是已经完成了,但是measure的全部流程还没有结束。
在执行完了等级View(DecorView)的onMeasure方法后,调用了DecorView父类的onMeasure
方法。DecorView的父类是 FrameLayout
,在FrameLayout的 onMeasure
中,调用了子View的 measure
方法,然后就这样传递下去直到所有的View都测量完成,measure的过程才算是圆满结束。
这一个流程如下所示,原图来自于《Android开发艺术探索》
总结
本章的内容主要是对View的工作流程有个概览,下一章开始我们将开始学习各个流程的详细的工作原理。
View的工作原理(一) 总览View的工作流程的更多相关文章
- JVM 的 工作原理,层次结构 以及 GC工作原理
JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...
- 《浏览器工作原理与实践》<06>渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
在上篇文章中,我们介绍了渲染流水线中的 DOM 生成.样式计算和布局三个阶段,那今天我们接着讲解渲染流水线后面的阶段. 这里还是先简单回顾下上节前三个阶段的主要内容:在 HTML 页面内容被提交给渲染 ...
- 《浏览器工作原理与实践》<05>渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段.这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练 ...
- Android学习笔记View的工作原理
自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还 ...
- Android之view的工作原理2
学习内容 View的底层工作原理,比如View的测量流程.布局流程以及绘制流程:以及常见的View回调方法:熟悉掌握前面的知识后,自定义View的时候也会更加的得心应手. 4.1 初识ViewRoot ...
- Android 中View的工作原理
Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...
- NameNode和SecondaryNameNode工作原理剖析
NameNode和SecondaryNameNode工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode中的元数据是存储在那里的? 1>.首先,我 ...
- DispatcherServlet的工作原理
下面是DispatcherServlet的工作原理图,图片来源于网络. 下面是我从DispatcherServlet源码层面来分析其工作流程: 1.请求到达后,调用HandlerMapping来查找对 ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
随机推荐
- VirtualBox安装Centos后实现文件夹共享
不同虚拟机中的系统和windows之间实现文件共享方式也不一样,在VMWare虚拟机请参考链接:http://www.cnblogs.com/vincentfu/p/5402666.html 进入主题 ...
- C++ new动态数组初始化
strlen函数是不包括‘\0’的长度的,sizeof计算的结果才包括'\0'的长度: C++ new动态数组初始化void testnew( const char* str ) { if (!str ...
- Golang异常处理-panic与recover
Golang异常处理-panic与recover 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在程序设计中,容错是相当重要的一部分工作,在 Go中它是通过错误处理来实现的,err ...
- oracle之回滚数据表 笔记
alter table [tableName] enable row movement;flashback table [tableName] to timestamp to_timestamp('2 ...
- 笔记 freemark list标签迭代Map<Map<String,Object>集合排序问题
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. 工作中出现一个比较特殊的问题,在模板ftl文件中,一般用list迭代map 举例: 后台: // 传入的参数 ...
- 使用JavaScript缓存图片
在JS中,为了让图片缓存起来,客户端JS定义了一个API,首先利用Image()构造函数来创建一个屏幕外图片对象,之后将该对象的src属性设置 期望的URL,由于图片元素并没有添加到文档中,因此它是不 ...
- 记一次ThreadPoolExecutor面试
ThreadPoolExecutor点滴 线程池应该也是面试绕不开的一个点,平时大家也没少用,但其实也有一些小Tips还是值得记录一下. Constructor public ThreadPoolEx ...
- ajax请求成功但不执行success-function回调函数的问题
在success:function(data){}下面加个error:function(){},看看是不是出错了走了error.如果是,说明返回值类型不符合要求. 比如:下面代码返回String类型. ...
- Java 语言多态性
https://www.ibm.com/developerworks/cn/java/java-language-polymorphism/index.html 定义多态性 多态性是面向对象编程中的一 ...
- shell升级完整记录
[root@localhost bash-4.3.30]# cat Makefile |grep prefix prefix = /usr/local exec_prefix = ${prefix} ...