Android开发Android开发经验谈Android技术知识

Android:一篇文章带你完全梳理自定义View工作流程

2020-06-21  本文已影响0人  不正经的创作者

前言

本文秉着“结论先行、详细分析在后”的原则,即先让大家感性认识,再通过理性分析从而理解问题; 所以,请各位读者先记住结论,再往下继续看分析; 文章较长,阅读需要较长时间,建议收藏等充足时间再进行阅读


目录

1. 储备知识

1.1 ViewRoot

// 在主线程中,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

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

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

1.3 Window、Activity、DecorView 与 ViewRoot的关系

1.4 自定义View基础

了解自定义View流程前,需了解一定的自定义View基础


2. 绘制准备


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 会负责测绘自身

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


4. 详细介绍

4.1 Measure 过程

1、在某些情况下,需要多次测量(measure)才能确定View最终的宽/高;

2、该情况下,measure过程后得到的宽 / 高可能不准确;

3、此处建议:在layout过程中onLayout()去获取最终的宽 / 高

4.2 Layout过程

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

4.3 Draw过程


5. 自定义View的步骤

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

步骤2:自定义属性

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

各位看官们可以点赞转发,因为你们的赞同/鼓励是我写作的最大动力!

上一篇下一篇

猜你喜欢

热点阅读