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

  1. JVM 的 工作原理,层次结构 以及 GC工作原理

    JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...

  2. 《浏览器工作原理与实践》<06>渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?

    在上篇文章中,我们介绍了渲染流水线中的 DOM 生成.样式计算和布局三个阶段,那今天我们接着讲解渲染流水线后面的阶段. 这里还是先简单回顾下上节前三个阶段的主要内容:在 HTML 页面内容被提交给渲染 ...

  3. 《浏览器工作原理与实践》<05>渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

    在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段.这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练 ...

  4. Android学习笔记View的工作原理

    自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还 ...

  5. Android之view的工作原理2

    学习内容 View的底层工作原理,比如View的测量流程.布局流程以及绘制流程:以及常见的View回调方法:熟悉掌握前面的知识后,自定义View的时候也会更加的得心应手. 4.1 初识ViewRoot ...

  6. Android 中View的工作原理

    Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...

  7. NameNode和SecondaryNameNode工作原理剖析

    NameNode和SecondaryNameNode工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode中的元数据是存储在那里的? 1>.首先,我 ...

  8. DispatcherServlet的工作原理

    下面是DispatcherServlet的工作原理图,图片来源于网络. 下面是我从DispatcherServlet源码层面来分析其工作流程: 1.请求到达后,调用HandlerMapping来查找对 ...

  9. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

随机推荐

  1. C#生成和识别二维码

    用到外部一个DLL文件(ThoughtWorks.QRCode.dll),看效果 生成截图 识别截图 生成二维码后右键菜单可以保存二维码图片,然后可以到识别模式下进行识别,当然生成后可以用手机扫描识别 ...

  2. HTML5 文件API

    filelist 表示文件对象的列表. <form name="upload"> <input type="file" name=" ...

  3. Mask RCNN 原理

    转自:https://blog.csdn.net/ghw15221836342/article/details/80084861 https://blog.csdn.net/ghw1522183634 ...

  4. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) A. Bits

    http://codeforces.com/contest/484/problem/A 题意: 询问[a,b]中二进制位1最多且最小的数 贪心,假设开始每一位都是1 从高位i开始枚举, 如果当前数&g ...

  5. Docker 入门 第二部分: 容器

    目录 Docker 入门 第二部分: 容器 先决条件 介绍 你的新开发环境 使用 Dockerfile 定义一个容器 Dockerfile 应用本身 requirements.txt app.py 构 ...

  6. java整理的一些面试资料

    平时逛博客的时候收集了一些认为不错的java面试题  以后跳槽的时候可以来这里刷一刷 1:后端技术精选 https://www.cnblogs.com/javazhiyin/tag/Java面试题/

  7. [BZOJ 1260][CQOI2007]涂色paint 题解(区间DP)

    [BZOJ 1260][CQOI2007]涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为 ...

  8. 如何让你的.vue在sublime text 3 中变成彩色?

    作者:青鲤链接:https://www.zhihu.com/question/52215834/answer/129495890来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. python 多进程的启动和代码执行顺序

    对照着廖雪峰的网站学习Python遇到些问题: 在进程中,父进程创建子进程时发现,显示不是按照顺序显示,疑问? 参照代码如下: from multiprocessing import Pool imp ...

  10. shell expect的简单用法【转】

    用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下:  ######## ...