Android自定义控件-UI绘制流程

自定义控件绘制流程拆解流程图原件 文档中实现了Android自定义控件的整个绘制流程拆解,主要包括量测、布局、绘制流程,也描述了为什么要如此的做量测、布局、绘制流程设计。 立即下载

目录

一、Activity加载显示基本流程

二、布局加载

一、探秘setContentView(activity屏幕安装的位置)

二、Window(电子屏幕)

三、PhoneWindow(手机屏幕)

四、DecorView(屏幕显示的内容)

五、关系图

三、UI绘制

1、requestLayout

2、invalidate

3、ViewRootImpl

4、流程图

5、masure

5.1、View的测量

5.2、ViewGroup的测量

6、layout

6.1、View的layout

6.2、ViewGroup的layout

7、draw

第一步:绘制背景

第二步:

第三步:绘制内容

第四步:绘制子view

第五步:

第六步:绘制滚动条

8、postInvalidate

三、套路自定义控件

继承View

继承ViewGroup

四、问题

五、TODO


一、Activity加载显示基本流程

二、布局加载

一、探秘setContentView(activity屏幕安装的位置)

其实就是调用了Window中的setContentView

getWindow()方法获取到的Window实现类是PhoneWindow

最终调用的还是PhoneWindow中的setContentView方法

二、Window(电子屏幕)

Window的类型

 

三、PhoneWindow(手机屏幕)

mContentParent为空的时候会调用如下方法

installDecor的作用:就是创建一个DecorView,并将窗体布局添加到DecorView中,然后返回ID为content的帧布局

初始化一个DecorView

然后调用generateLayout方法

generateLayout方法的作用就是设置一些窗体的属性值,然后窗体布局添加到DecorView中,并返回窗体布局中ID为content的帧布局

四、DecorView(屏幕显示的内容)

DecorView是PhoneWindow中的内部类,继承帧布局

 

五、关系图

三、UI绘制

UI绘制的起始点

在PhoneWindow中调用setContentView的时候调用了mContentParent的addView方法,其实调用就是ViewGroup中的addView方法。

1、requestLayout

最终调用的ViewRootImpl中的requestLayout方法

最终调用了scheduleTraversals方法

2、invalidate

ViewGroup中的invalidate方法调用了View中的invalidate方法,该方法必须在UI线程中被调用

View中invalidate方法如下

invalidateInternal关键代码如下

上述关键代码中最终调用的是ViewGroup中的invalidateChild方法

ViewGroup中invalidateChild方法的关键代码如下

通过do-while循环找到根布局(ViewRootImpl),并调用其中的invalidateChildInParent

3、ViewRootImpl

performTraversals关键代码

performLayout关键代码

performDraw关键代码

4、流程图

5、masure

5.1、View的测量

方法中的两个参数是由父容器传递进来的,是测量规则。

测量规则由两部分组成,高2位是MODE,低30位是size

测量规则由三种类型

  1. EXACTLY: 精确的。
  2. AT_MOST: 最大
  3. UNSPECIFIED: 不确定

onMeasure方法代码如下

5.2、ViewGroup的测量

作用:获取子view的LayoutParams,通过LayoutParams获取到子view的尺寸,然后通过父容器的测量规则和子view的尺寸通过getChildMeasureSpec方法生成一个测量规则传递给子view进行测量

getChildMeasureSpec方法如下

6、layout

6.1、View的layout

在View中onLayout是空实现

留给子类自己需要的时候去实现

6.2、ViewGroup的layout

实际上ViewGroup中的layout方法调用的是父类View的layout方法

ViewGroup中的onLayout方法是一个抽象类,子类必须要去实现

RelativeLayout中的onLayout方法如下

最终还是调用子view的layout方法

7、draw

在ViewRootImpl类中的drawSoftware方法中创建了canvas并调用了view.draw(canvas)

View中的draw方法如下

第一步:绘制背景

第二步:

第三步:绘制内容

因为每个View内容不同,所以onDraw留给子类实现

第四步:绘制子view

View类中dispatchDraw是空实现,如果有子view再去复写该方法,如ViewGroup

通过源码我们可以看到ViewGroup中通过for循环调用了drawchild方法

第五步:

第六步:绘制滚动条

8、postInvalidate

通过该方法注释可以知道这个方法是在子线程中被调用

最终调用了ViewRootImpl中的dispatchInvalidateDelayed方法

最终还是通过handle调用了在主线程中invalidate方法

 

三、套路自定义控件

继承View

重新onMeasure方法测量自己的宽高,然后调用setMeasuredDimension设置宽高

具体可以参考TextView源码中的onMeasure()方法的写法,其中就是按照上述顺序完成的

继承ViewGroup

在onMeasure方法中需要测量子控件大小,还需要测量自身大小,然后调用setMeasuredDimension设置自身的宽高,在测量子view是可用使用ViewGrou提供的测量子view的方法,也可以自定义测量规则,最后在onLayout方法中对子view进行布局

具体可以参考LinearLayout或RelativeLayout中的onMeasure()方法,其中子view的获取都是通过for循环完成了

四、问题

如何让一个ScrollView里面的ListView全部展开?

通常的方法是继承ListView,重写onMeasure方法:

为什么要这么做?

1.设置mode为什么是 MeasureSpec.AT_MOST?

2.value为什么是Integer.MAX_VALUE >> 2?

 

五、TODO

自定义控件实践

Android 流程步骤控件 Android 流程步骤控件,实现对提交资料的时候,分部的流程控制 立即下载

相关推荐

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

android 自定义流程图,GitHub - zx-Zhu/ProcessChart: 安卓自定义流程进度图控件

一个安卓自定义流程图先上效果图:如图,可实现设置:总流程数、已完进度程数、已完成颜色、各个流程点击事件、各个标题使用方法1.导入compile 'com.github.pavlospt:circleview:1.3'依赖包(因为用到了CircleView)2.直接把这两个文件一个xml一个java,复制粘贴进项目(代码放在了文章最后,暂时还没弄成开源库,有时间直接做成依赖包倒进去)在xml中写入P...

weixin_39807691的博客 633

Windows11安装UE4+Airsim

Windows11安装UE4+Airsim

Legendyyy的博客 3743

Android 自定义带节点的流程控件

以前常用自定义控件,然后到了这个公司之后发现大家都很少用,然后就慢慢的生疏了。但是呢自己以前自定义控件都是用各种view去拼。可是有的时候不是很好用。所以我还是鼓起勇气draw了一个。先来看看我们的需求吧,是这样的以个效果图:是类似这样的一个流程节点,但是我觉得太丑了我后面改了一下,我们的界面总是这么不统一,每个界面的节点都不一样,在开始之前能先听我吐槽一下吗?算了你拒绝不了:这也是一个又是一个还...

xxx_19942的博客 3846

使用gsplat进行3D高斯泼溅的方案

gsplat 不是一个软件,而是一个深度优化CUDA的开源Python库。它的作者是 Nerfstudio 团队,这个团队最出名的项目是 Nerfstudio,是对 NeRFs 方法支持最好的一套框架。据其所述,出于对新一代技术的好奇,他们构建了 gsplat 这个库。它支持 Windows/Linux 两个系统,使用前必须准备好 Nvidia 显卡。跑这个项目真是特别费劲,官方的文档支持不够完善,以至于遇到问题,开发者们都只能在issue区里抱团取暖。

兴趣使然的创作者 2106

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 833

android打印机流程图,流程图控件GoJS创建打印图表教程

GoJS是一款功能强大,快速且轻量级的流程图控件,可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图,且极大地简化您的JavaScript / Canvas 程序。打印图表通常是通过制作图表的几张图像并将其保存,将其插入PDF或其他文档中或直接从浏览器中进行打印来完成的。在此页面上,我们将从大图中创建几个图像,并准备一些CSS,以便在打印此页面时仅打印那些图像。该页面使用D...

weixin_42298068的博客 311

对族实例进行任意的矩阵变换,需要什么样的族?

问:一个小问题,想向您请教一下。 能不能实现一个这样的操作:创建了一个常规模型的FamilyInstance,然后知道旋转和平移的矩阵,能否根据变换矩阵更新FamilyInstance的位置,绕任意轴旋转任意角度。 请问什么样的实体才能在revit项目文件中任意旋转?貌似一般的实例只能在XY平面内旋转,并且LocationPoint中只有一个Rotation参数。答:您好,因为Revit里面的构件

我爱Revit —— BIM应用及BIM应用软件解决方案专栏 3628

Android标签流控件的实现

在我们的开发过程中,常常会遇到这样的场景: 我们展示一种物品或者为某一事物添加一些标签。比如说,我们买一件衣服,可以有以下几种标签:杰克琼斯,男士,运动等等。 但我们这时候可能并不知道标签的数量和每个标签的文字,所以,我们在开发过程中,需要实现下面的功能: 我们从服务器端获取标签的信息,然后将其动态的添加到布局中,并且我们能够得到我们选择容器的信息,并将选中的标签重新返回至服务器。 因此,

wk843620202的专栏 4578

XC7Z010-1CLG400C开发板ADC引脚配置全攻略(附完整引脚列表)

本文详细解析了XC7Z010-1CLG400C开发板的ADC引脚配置方法,涵盖XADC模块基础、CLG400封装的引脚布局、硬件设计规范及Vivado工程配置实战。特别提供了完整的引脚列表和性能优化技巧,帮助开发者高效实现模拟信号采集,适用于Zynq-7000系列开发。

weixin_29188043的博客 466

【本地部署实战】LM Studio深度使用指南:从环境搭建到模型调优

LM Studio通过极简的操作流程和强大的生态兼容性,让本地部署大模型成为可能。随着M4芯片的发布和CUDA 12.0的优化,未来本地化AI开发将迎来新的爆发点。建议开发者关注官方Discord社区(https://discord.gg/lmstudio)获取最新模型支持信息。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 8751

android 自定义流程图,一篇文章弄懂Android自定义viewgroup的相关难点

本文的目的目的在于教会大家到底如何自定义viewgroup,自定义布局和自定义测量到底如何写。很多网上随便搜搜的概念和流程图这里不再过多描述了,建议大家看本文之前,先看看基本的自定义viewgroup流程,心中有个大概即可。本文注重于实践viewgroup 的测量布局流程基本梳理稍微回顾下,基本的viewgroup绘制和布局流程中的重点:1.view 在onMeasure()方法中进行自我测量和保...

weixin_29014939的博客 345

2025年微信小程序获取手机号授权登录注册详细教程(含服务端)。不弹窗原因以及减少组件用量的方法

前端把获取到的code传给后端,后端获取access_token和前端传过来的code,请求服务器接口,即可获取到手机号。

coderYYY的博客 3万+

android ui自定义控件,Android-UI控件的绘制流程以及自定义控件的具体操作

View视图安卓应用中非常重要的组成部分,它不仅是构成应用界面的基本单元,还是与用户交互的最直接对象。视图View作为界面的基本元素,是由View System进行管理的。在Android中,视图控件主要被分成两大类,一类是单一控件View,另外一类是可以包含并管理子控件的ViewGroup,在一个界面布局中,ViewGroup与View的嵌套与组合,就构成了一棵控件树,经过一系列流程绘制在屏幕上...

weixin_35487052的博客 326

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android自定义ui电池,Android自定义控件-UI绘制流程

一、布局加载一、探秘setContentView(activity屏幕安装的位置)其实就是调用了Window中的setContentViewgetWindow()方法获取到的Window实现类是PhoneWindow最终调用的还是PhoneWindow中的setContentView方法二、Window(电子屏幕)Window的类型三、PhoneWindow(手机屏幕)mContentParent...

weixin_42615743的博客 291

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android-UI控件的绘制流程以及自定义控件的具体操作

View视图安卓应用中非常重要的组成部分,它不仅是构成应用界面的基本单元,还是与用户交互的最直接对象。视图View作为界面的基本元素,是由View System进行管理的。   在Android中,视图控件主要被分成两大类,一类是单一控件View,另外一类是可以包含并管理子控件的ViewGroup,在一个界面布局中,ViewGroup与View的嵌套与组合,就构成了一棵控件树,经过一系列

DavidWillo的博客 1638

ViewGroup学习之绘制过程

Android UI界面由以下树形结构组成, 从图中可以看出, UI界面是有View与ViewGroup两大类控件组成,在下面树形图中不管是View还是ViewGroup都是从android.view.View中派生, 而ViewGroup作为容器, 它可以装载和管理其下的一些列由android.view.View派生出来的元素(View和ViewGroup):               由

jayronlou 3484

Android界面的View以及ViewGroup的区别

因为这个问题会经常成为面试的热点,所以我们来谈谈View以及ViewGroup的区别。 先看看View及ViewGroup类关系 AndroidView和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。这就证明了一点,View代表了用户界面组件的一块可绘制的...

weixin_30315905的博客 173

Android学习—— Android自定义控件

Android自定义控件 安卓在使用中大多数使用已有的一些控件,用法比较简单,还有一部分是比较复杂的、用户自己想的控件,这些就需要进行自定义控件,今天就来简单说一下自定义控件。 1、绘制过程 创建一个类,继承View类 onMeasure()方法,测量计算视图的大小 onLayout()方法,设置视图在屏幕中显示的位置 onDraw()方法,绘制视图 以上就是自定义控件的绘制过程。 2、主要内...

weixin_34041003的博客 115

Android UI系列

Android UI系列 一 UI绘制流程及原理 二 UI绘制流程(测量,布局,绘制) 三 Paint画笔高级应用 四 Paint滤镜,Xfermode 五 Canvas高阶使用技巧 六 贝塞尔曲线 七 基于PathMeasure源码分析 八 事件分发机制详解 九 自定义动画框架 十 平行动画实现 十一 屏幕适配:自定义像素适配,百分比适配,刘海屏适配 十二 自定义控件 十三 阿里VLayout原...

初心一点的专栏 213

Android自定义控件解析

1,GDI介绍 2,UI绘制流程 3.自定义控件的实现 GDi(Graphics Device interface)及时图形设备接口,它的主要任务是用来系统与绘图程序之间的信息交互 Android的GDI在上层为Gui提供一个抽象的概念,GDI输出抽象成了文本,画笔,位图操作等设备无关的操作,让应用程序只需要面向逻辑的设备的上下文进行输出操作,而不要涉及设备的输出设备,以及输出边界的管理,

long704480904 3423

Android群英传学习-第三章:控件架构与自定义控件详解

第三章:Android控件架构与自定义控件详解Android控件架构  上图为View树结构,Activity中使用的findViewById()方法,就是在控件树种以树的深度优先遍历来查找对应的元素.每棵树的顶部都有一个ViewParent对象,是整棵树的控制核心,所有的交互事件都由它统一调度和发配,从而可以对整个视图进行整体的控制.  Activity中使用SetContrntView设置布局之

Brioal Is Hardworking 1957

Android View绘制流程

Android View绘制流程 框架分析 在之前的下拉刷新中,小结过触屏消息先到WindowManagerService(Wms)然后顺次传递给ViewRoot(派生自Handler),经decor view到Activity再传递给指定的View,这次整理View的绘制流程,通过源码可知,这个过程应该没有涉及到IPC(或者我没有发现),需要绘制时在UI线程中通过ViewRoot发送一个异步

dennyWang的专栏 641

Android View绘制流程

框架分析 在之前的下拉刷新中,小结过触屏消息先到WindowManagerService(Wms)然后顺次传递给ViewRoot(派生自Handler),经decor view到Activity再传递给指定的View,这次整理View的绘制流程,通过源码可知,这个过程应该没有涉及到IPC(或者我没有发现),需要绘制时在UI线程中通过ViewRoot发送一个异步请求消息,然后ViewRoot自己接

入凡尘笔录 551
上一篇: Android技术点总结
下一篇: GitHub上生成Markdown [TOC] 样式的目录 --- DOM方式实现
风之旅人、
博客等级 码龄11年 5粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值