目录

  • View的绘制流程简介
  • Activity和window和view 的关系
  • Activity和Window是什么时候建立联系的呢?
  • ViewRootImpl
  • View的绘制流程总结

View的绘制流程简介

view的绘制流程主要为measure,layout,draw三个阶段

View与window的逻辑结构

对应于ViewRootImpl(替代ViewRoot)类,它是连接WindowMannager和DecorView的纽带,View的三大流程均是通过ViewRoot完成的,当activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联在ViewRootImpl里面performTraversals()分发

Activity和window和view 的关系

activity是系统可视化交互组件,四大组件都由AMS统一管理生命周期,事实上它的职责只是生命周期的管理,处于单一职责的原则,那势必需要将activity和其上的视图View进行解耦,那么久引入window的概念,它是个抽象类,对于activity来说,它的具体实现类是PhoneWindow,在activity执行attach的时候,会创建一个PhoneWindow对象,PhoneWindow作为装载根视图DecorView的顶级容器,activity通过setContentView实际上是调用了PhoneWindow来创建DecorView,并解析xml布局加载到DecorView的contentView部分。

Activity和Window是什么时候建立联系的呢?

scheduleLaunchActivity

–>handleLauchActivity(初始化了sWindowMannagerService

)–>perforLaunchActivity

–>activity.attach

–>new PhoneWindow(this,window) + 将window和windowMangerService绑定:同时,此时完成了window和activity的绑定

在activityThread 调用lauchactivity的时候,会调用activity的attach函数,在attach函数里面将view和activity绑定将window和wms进行绑定,绑定完成之后,才会调用,instrumentation的callactivity的Oncreate函数,这个时候才调用activity生命周期的onCreate函数,所以window和activity建立联系是在attch的时候,真正显示视图的是在onCreate方法里面的setContentView,这个时候才会把我们layout的xml布局加载到ContentView来

ContentView只是DecorView的一部分,而DecorView是系统添加上去的。

ViewRootImpl

ViewRootImpl的根本目的是用来管理整个View的流程,就是通过performTraversals这个方法

performTraversals方法,首先会调用performMeasure,这个方法会调用顶级view的measure函数

子容器会重复父容器的measure过程,如此反复就完成了整个树的遍历,

view的measure函数会调用onMeasure函数 ,performLayout和performDraw,也亦是如此,唯一不同的是draw中调用的是dispatchDraw

然后performTraversals中会调用performLayout事件,然后会调用host也就是view的layout方法,调用里面的onLayout方法

然后会在performTraversals中执行performDraw方法,然后同样的逻辑,调用View的Draw函数,然后Draw函数调用onDraw函数

通过ViewRootImpl --> 调用performTraversals中 :performMeausre–>performLayout–>performDraw

从而对应到onMeasure–>onLayout–>onDraw

View的绘制流程总结

如图所示,performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶级View的measure、layout、draw这个三个流程。其中:

1.perfromMeasure中会调用measure方法,在measure方法中又会调用onMeasure方法,在onMeasure方法中会对所有的子元素进行measure过程,这个时候measure流程就从父容器传递到子元素中了,这样就完成了一次measure过程。接着子元素会重复父元素的measure过程,如此反复就完成整个View树的遍历。

2.performLayout的传递流程和performMeasure是一样的。

3.performDraw的传递过程是在draw方法中通过dispathDraw来实现的,本质上并没有区别。

Measure过程决定了View的宽高,Measure完成以后,可以通过getMeasuredWidth和getMeasuredHeight方法来获取到View测量后的宽高,在几乎所有的情况下它都等于View的最终宽高,这仅仅是在代码规范的前提之下。
layout最终决定了View的四个顶点的坐标和实际View的宽/高,完成以后,可以通过getTop、getBottom、getLeft、getRight来拿到View的四个顶点坐标位置,并可以通过getWidth和getHeight来得到View的最终宽高

draw过程决定了View的显示,只有draw方法完成以后View的内容才会最终显示在屏幕上

draw过程

1.绘制背景background.draw(canvas)

2.绘制自己(ondraw)

3.绘制children(dispatchDraw)

4.绘制装饰(onDrawScrollBars)

【Android面试】View的绘制流程相关推荐

  1. Android O: View的绘制流程(二):测量

    在前一篇博客Android O: View的绘制流程(一): 创建和加载中,  我们分析了系统创建和加载View的过程,这部分内容完成了View绘制的前置工作. 本文开始分析View的测量的流程. 一 ...

  2. Android O: View的绘制流程(三):布局和绘制

    前一篇文章Android O: View的绘制流程(二):测量中,  我们分析了View的测量流程.  当View测量完毕后,就要开始进行布局和绘制相关的工作,  本篇文章就来分析下这部分流程. 一. ...

  3. Android之View的绘制流程解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 自定义View在Android中占据着非常重要的地位,因此了解View的 ...

  4. Android O: View的绘制流程(一): 创建和加载

    从这篇博客开始,我们会用几篇文章,  基于Android O的代码,分析一下View的绘制流程. 在分析具体的绘制流程前,我们先来了解一下XML中定义的View,  如何被创建和加载. 一.setCo ...

  5. 从源码解析-Android中View的绘制流程及performTraversals方法

    谈谈Activity的setContentView是怎么加载XML视图的 谈谈Activity的View怎么与View绘制工具ViewRootImpl关联的 在前面两篇文章中分析了View是如何跟绘制 ...

  6. android自定义view流程,Android 自定义View--从源码理解View的绘制流程

    前言 在Android的世界里,View扮演着很重要的角色,它是Android世界在视觉上的具体呈现.Android系统本身也提供了很多种原生控件供我们使用,然而在日常的开发中我们很多时候需要去实现一 ...

  7. Android自定义View系列之详解View的绘制流程

    目录 一.开场白 二.View的绘制流程 2.1测量的过程 2.2布局的过程 2.3绘制的过程 一.开场白 开讲之前我们先预设一种自定义ViewGroup的场景:我们知道LinearLayout.Fr ...

  8. Android View的绘制流程(1) -- 测量onMeasure

    鉴于是首篇讲解自定义view流程,之前也在网上搜了一些博主的博客看了看,都是大同小异,今天抽时间自己总结一下,分享一下自己的感悟,也算是一篇笔记. (本篇为开头篇,稍微讲述一下有关的东西) View的 ...

  9. android的构成和工作流程,分析Android中View的工作流程

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 在分析View的工作流程时,需要先分析一个很重要的类,MeasureSpec.这个类在View的测量(Measure)过 ...

最新文章

  1. 记一次游戏私服getshell过程
  2. ARC114E - Paper Cutting 2(组合数学,概率与期望)
  3. c# 调用cmd WaitForExit 死锁问题解决方案
  4. java 获取服务器IP地址及MAC地址
  5. 【JZOJ3347】树的难题
  6. 5.6 除法器的实现
  7. CTO用“汉德公式”来定责,我大写的服!
  8. Flash网络游戏简单的源代码
  9. Nginx的请求转发使用步骤
  10. 查看npy文件中存的是什么
  11. 将网络地图资源加载进Arcgis中
  12. 测试世界各地打开网站的速度
  13. python与医学图像处理_医学图像处理与深度学习(一)
  14. 新磁盘分区格式化挂载
  15. B站再出争议,大会员提前三天扣费,这波小破站赚了多少?
  16. windows编程中wParam和lParam消息
  17. 微服务架构实战第八节 微服务安全框架,认证与授权
  18. 中国计算机应用大会征稿通知,全球华人计算机教育应用大会(GCCCE)2015征稿启事...
  19. 开发常用linux命令
  20. 冰点文库下载器 v3.2.9 去广告绿色版免费下载

热门文章

  1. pb代码graph绘图表_程序员轻松绘图神器
  2. 软工结对编程之二——UI设计(10061191洪虹10061162刘俊伟)
  3. python 爬虫 使用requests模拟请求后台,返回为 空 问题
  4. 【uva12232/hdu3461】带权并查集维护异或值
  5. php mysql 权限_mysql权限
  6. 续写墨仓式传奇 专访爱普生市场负责人
  7. YOLO V3 一步步训练自己的目标检测
  8. openfiler php,Openfiler - 开源存储管理平台 (CN) | Openfiler 简易安装教程
  9. java hibernate 自定义排序_java – 如何在hibernate中对关联表进行排序?
  10. 以下选项不是python文件操作的是_以下选项不是Python文件读操作的是(____)。...