<返回更多

Android:手把手带你清晰梳理自定义View工作全流程

2019-08-06    
加入收藏

前言


目录

Android:手把手带你清晰梳理自定义View工作全流程

 


1. 储备知识

1.1 ViewRoot

  1. 连接WindowManager 和 DecorView
  2. 完成View的三大流程: measure、layout、draw
// 在主线程中,Activity对象被创建后:
// 1. 自动将DecorView添加到Window中 & 创建ViewRootImpll对象
root = new ViewRootImpl(view.getContent(),display);
// 3. 将ViewRootImpll对象与DecorView建立关联
root.setView(view,wparams,panelParentView)

1.2 DecorView

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

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

Android:手把手带你清晰梳理自定义View工作全流程

 

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

// 在代码中可通过content得到对应加载的布局
// 1. 得到content
ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
// 2. 得到设置的View
ViewGroup rootView = (ViewGroup) content.getChildAt(0);

1.3 Window、Activity、DecorView 与 ViewRoot的关系

Android:手把手带你清晰梳理自定义View工作全流程

 

Android:手把手带你清晰梳理自定义View工作全流程

 

1.4 自定义View基础

了解自定义View流程前,需了解一定的自定义View基础,具体请看文章:(1)自定义View基础 - 最易懂的自定义View原理系列


2. 绘制准备

Android:手把手带你清晰梳理自定义View工作全流程

 

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


3. 绘制流程概述

/**
 * 源码分析:ViewRootImpl.performTraversals()
 */
 private void performTraversals() {
 		// 1. 执行measure流程
 // 内部会调用performMeasure()
 measureHierarchy(host, lp, res,desiredWindowWidth, desiredWindowHeight);
 // 2. 执行layout流程
 performLayout(lp, mWidth, mHeight);
 // 3. 执行draw流程
 performDraw();
 }

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

Android:手把手带你清晰梳理自定义View工作全流程

 

Android:手把手带你清晰梳理自定义View工作全流程

 


Android:手把手带你清晰梳理自定义View工作全流程

 

下面,我将详细讲解View绘制的三大流程:measure过程、layout过程、draw过程


4. 详细介绍

4.1 Measure 过程

Android:手把手带你清晰梳理自定义View工作全流程

 


Android:手把手带你清晰梳理自定义View工作全流程

 

4.2 Layout过程

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

Android:手把手带你清晰梳理自定义View工作全流程

 

Android:手把手带你清晰梳理自定义View工作全流程

 

请看文章:自定义View Layout过程 - 最易懂的自定义View原理系列(3)

4.3 Draw过程

Android:手把手带你清晰梳理自定义View工作全流程

 


Android:手把手带你清晰梳理自定义View工作全流程

 

至此,关于自定义View的工作流程讲解完毕。


5. 自定义View的步骤

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

Android:手把手带你清晰梳理自定义View工作全流程

 

步骤2:自定义属性

  1. 在values目录下创建自定义属性的xml文件
  2. 在自定义View的构造方法中加载自定义XML文件 & 解析属性值
  3. 在布局文件中使用自定义属性

6. 实例讲解

结合原理 & 实现步骤,若需实现1个自定义View,请看文章:手把手教你写一个完整的自定义View


7. 总结

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>