当前位置: 首页 > news >正文

浅析Android UI——View 的绘制

View 的绘制流程分为三步:measure(测量)、layout(布局)、draw(绘制)

  • measuer:根据父View船体的MeasureSpec进行计算大小
  • layout:根据measure 子View 所得的布局大小和布局参数,确定Veiw的位置
  • draw:把view对象绘制到屏幕上

大致流程如下:

img

measure

iew 测量流程是父 View 先测量子 View,等子 View 测量完了,再来测量自己

measure 主要功能就是测量设置 View 的大小。该方法是 final 类型,子类不能覆盖,在方法里面会调用 onMeasure(),我们可以复写 onMeasure() 方法去测量设置 View 的大小

layout()

View 的 layout 的方法也是非常长。大致作用就是设置 View 的在父 View 的位置,然后判断位置是否发生变化,是否需要重新调用排版布局,如果是需要重新布局则用了 onLayout()方法。

在OnLayout 方法中,View 里面是一个空实现,而 ViewGroup 则是一个抽象方法。为什么这么设计呢?因为onLayout中主要就是为了给遍历View然后进行排版布局,分别设置View在父View中的位置。既然如此,那么View的意义就不大了,而ViewGruo 必须实现,不然没法对子View进行布局。那么如何对 View 进行排版呢?

draw()

  • 第一步:drawBackground(canvas): 作用就是绘制 View 的背景。
  • 第三步:onDraw(canvas) :绘制 View 的内容。View 的内容是根据自己需求自己绘制的,所以方法是一个空方法,View的继承类自己复写实现绘制内容。
  • 第三步:dispatchDraw(canvas):遍历子View进行绘制内容。在 View 里面是一个空实现,ViewGroup 里面才会有实现。在自定义 ViewGroup 一般不用复写这个方法,因为它在里面的实现帮我们实现了子 View 的绘制过程,基本满足需求。
  • 第四步:onDrawForeground(canvas):对前景色跟滚动条进行绘制。
  • 第五步:drawDefaultFocusHighlight(canvas):绘制默认焦点高亮

绘制发起入口

在介绍飞起绘制入口之前,我们先了解Window ViewRootImpl DecorView之前的联系。一个activity包含一个window window是一个抽象基类,是activity和整个view系统交互的接口,只有一个子类实现phonewindow,提供了一系列窗口的方法,比如设置背景,标题等。

一个phonewindow对应一个DecorView和一个ViewRootImpl,DecorView是ViewTree里面的顶层布局,是继承于FrameLayout 包含两个子View 一个id = statusBarBackground的View和 LinearLayout,LinearLayout里面包含title跟content title就是平时用的TitleBar或者ActionBar,content也就是FrameLayout ,activity通过设置setContent 加载布局的时候加载到这个view上面,ViewRootImpl就是简历DecorView和window之前的联系。

—————————————————————————————

我们简单浅析了一下Android UI的View绘制,想深入Android UI学习,源码解读可前往《AndroidUI绘制解析》。(里面内容丰富,文章无法发文篇幅有限)展示如下:
1
2

Android UI绘制学会的,可以进阶自己更多Android技术,比喻framework、flutter、jetpack等等。这些都是进入大厂需要的核心技术,现在人人都卷,稍不注意饭碗就没了。

相关文章:

  • 一文看懂25个神经网络模型,神经网络神经元模型
  • 神经网络模型训练过程,神经网络模型应用实例
  • NR PDCCH(二) SearchSpace
  • Vue2(十二):Vuex环境搭建、Vuex工作原理、几个配置项、多组件共享数据、Vuex模块化
  • CREO图文教程:三维设计案例之齿轮参数化设计(渐开线+拉伸+轴阵列)图文教程之详细攻略
  • 【JavaEE进阶系列 | 从小白到工程师】Collections工具类的常用方法
  • Python 标准库之 fileinput 和 文件迭代器
  • C++征途 --- map/multimap容器
  • php 手机营业厅业务管理系统
  • VulnHub
  • Java Design Patterns 之 抽象工厂模式
  • java计算机毕业设计基于安卓Android的数字猎头招聘管理APP
  • Flink 流处理API
  • 技术实践|开门见山谈Prometheus
  • npm包版本不一致的问题
  • #Java异常处理
  • 《深入 React 技术栈》
  • 3.7、@ResponseBody 和 @RestController
  • co模块的前端实现
  • Javascript设计模式学习之Observer(观察者)模式
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node 版本管理
  • PermissionScope Swift4 兼容问题
  • Puppeteer:浏览器控制器
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Travix是如何部署应用程序到Kubernetes上的
  • ubuntu 下nginx安装 并支持https协议
  • vue-router 实现分析
  • 对象管理器(defineProperty)学习笔记
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 经典排序算法及其 Java 实现
  • 警报:线上事故之CountDownLatch的威力
  • 盘点那些不知名却常用的 Git 操作
  • 双管齐下,VMware的容器新战略
  • 算法---两个栈实现一个队列
  • 找一份好的前端工作,起点很重要
  • #1015 : KMP算法
  • $jQuery 重写Alert样式方法
  • (27)4.8 习题课
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (离散数学)逻辑连接词
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (正则)提取页面里的img标签
  • (转)linux下的时间函数使用
  • .aanva
  • .net生成的类,跨工程调用显示注释
  • .project文件
  • @Transaction注解失效的几种场景(附有示例代码)