安卓入门四十六 View工作流程

1. 储备知识

1.1 ViewRoot

定义
连接器,对应于ViewRootImpl类

作用

连接WindowManager 和 DecorView

完成View的三大流程: measure、layout、draw

特别注意

1.2 DecorView

定义:顶层View

即 Android 视图树的根节点;同时也是 FrameLayout 的子类

作用:显示 & 加载布局

View层的事件都先经过DecorView,再传递到View

特别说明
内含1个竖直方向的LinearLayout,分为2部分:上 = 标题栏(titlebar)、下 = 内容栏(content)

在Activity中通过 setContentView()所设置的布局文件其实是被加到内容栏之中的,成为其唯一子View = id为content的FrameLayout中

1.3 Window、Activity、DecorView 与 ViewRoot的关系

简介


之间的关系

2. 绘制准备

回忆上图,可看出最后1步 = 绘制

示意图

但在绘制前,系统会有一些绘制准备,即前面几个步骤:创建PhoneWindow类、DecorView类、ViewRootmpl类等

故,下面我会先将绘制前的准备,再开始讲绘制流程

3. 绘制流程概述

从上可知,View的绘制流程开始于:ViewRootImpl对象的performTraversals()

从上面的performTraversals()可知:View的绘制流程从顶级View(DecorView)的ViewGroup开始,一层一层从ViewGroup至子View遍历测绘

即:自上而下遍历、由父视图到子视图、每一个 ViewGroup 负责测绘它所有的子视图,而最底层的 View 会负责测绘自身

绘制的流程 = measure过程、layout过程、draw过程,具体如下

示意图

示意图

4. 详细介绍

4.1 Measure 过程

作用
测量View的宽 / 高

  • 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;
  • 该情况下,measure过程后得到的宽 / 高可能不准确;
  • 此处建议:在layout过程中onLayout()去获取最终的宽 / 高

具体流程

4.2 Layout过程

作用
计算视图(View)的位置

即计算View的四个顶点位置:Left、Top、Right 和 Bottom

具体流程

4.3 Draw过程

作用
绘制View视图

具体流程

5. 自定义View的步骤

步骤1:实现Measure、Layout、Draw流程

  • 从View的工作流程(measure过程、layout过程、draw过程)来看,若要实现自定义View,根据自定义View的种类不同(单一View / ViewGroup),需自定义实现不同的方法
  • 主要是:onMeasure()onLayout()onDraw(),具体如下

步骤2:自定义属性

  • 在values目录下创建自定义属性的xml文件
  • 在自定义View的构造方法中加载自定义XML文件 & 解析属性值
  • 在布局文件中使用自定义属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值