| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 【Android】自定义 View 系列- 绘制流程 -> 正文阅读 |
|
[移动开发]【Android】自定义 View 系列- 绘制流程 |
前言本文旨在让读者对整个绘制流程有个感性的认识-一个图是经过了什么样的流程最后展示到用户面前的。 在讲解流程之前,我们需要有一个模型 ?解释:我们画的图,就是通过 Paint(画笔)作用到 Canvas(画板)后,再由画板作用于手机屏幕。所以这也为后面想要对图片做放大或缩小,要先做放大或缩小的操作再做绘制做了解释(这里不理解,没关系。后面内容会重新提到)。[也就是会有些文章说到的-在onDraw() 的时候,要‘顺着逻辑想,倒着逻辑写’] 绘制流程有了上面的基本模型后,我们接着来看绘制流程的具体过程吧。 一共有三个过程:测量过程(Measure),布局过程(Layout),绘制过程(Draw)。 不需要死记硬背,我们带着逻辑去理解即可。我们从结果出发,需要绘制一个图,我们总得知道绘制到哪里,所以就需要布局。布局,其实就是找到图的四个点(left,top,right,bottom)[其实也就是图的大小。要会变通,不一定就是要这四个点,有了起点,然后知道了图的宽高,也是一样的],这样我们才知道把这个图放在画板的具体什么位置。正因为布局过程中需要知道图的大小,所以需要在布局前,进行测量过程。那这样我们也就知道测量过程其实就是得出图的大小,只不过是要根据一些规则(父 View 的约束和本身的建议)来得出结果。所以这个整个流程就很自然的出来了。 接下来,会从 单个 View 和 ViewGroup 两个角度来讲一下三个过程。 测量过程单个View,一般是由 父View 通过 child.measure() 触发子 View 的 onMeasure()
然后 View 中的 measure() 方法
其中 onMeasure() 方法,就是我们重写的方法,然后根据规则得出 View 的大小。[这里说到的规则,就是 MeasureSpec,本文旨在理解流程,暂时不穿插该内容。后面文章会单独讲解 ]。那在 onMeasure 得到的数据,怎么在onLayout 中使用呢?我们当然可以用一个变量存起来,但实际上,我们只需要通过 setMeasuredDimension(width,height) 就可以在 onLayout 中通过 width 和 height 获取对应的数据了。 那么,整个流程如下图所示: ?ViewGroup 的测量过程,思想上也是得到自己的宽高,那主要是如何确定 ViewGroup 的宽高呢?那就是当确定了该 ViewGroup 的所有子 View 的宽高后,才知道自身的宽高。所以 ? 布局过程单个View - 布局过程 layout() 为布局入口,然后通过 setFrame() 后确定 View 的四个点。 而因为单个 View 在 layout() 中就已经确定了自己的位置,所以 onLayout() 是有个空实现 ViewGroup - 布局过程 当知道了单个 View 是如何布局,那么 ViewGroup 自身定位,再进行子 View 的布局[就是,又回到了上图的步骤] 绘制过程从源码上看,可以分为7步 主要步骤就是:绘制背景-》绘制内容本身-》绘制子View-》绘制装饰(前景,滚动条等),其中对于单个View来说,dispatchDraw(canvas) 是一个空实现
? 最后附上,完整的思维导图 ?若对内容存在疑惑,或者质疑。欢迎评论区交流,或者私聊指教一番。感激不尽~ |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 8:36:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |