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

Android view 基本的绘制流程

回答思路

概述
View 的绘制流程是从 ViewRootImpl 的 performTraversals() 方法开始的,分为 测量(Measure)、布局(Layout) 和 绘制(Draw) 三个阶段。
它是一个递归的过程,从根 View(通常是 DecorView)向下传递到每个子 View,最终完成整个视图树的绘制。

测量阶段:通过 measure() 和 onMeasure(),计算每个 View 的宽高。

  • measure():调用 View 的测量逻辑。
  • onMeasure():子类通过重写该方法,计算自身尺寸并调用 setMeasuredDimension() 保存结果。

布局阶段:通过 layout() 和 onLayout(),确定每个 View 的位置。

  • layout():由父 View 调用,确定子 View 的位置。
  • onLayout():ViewGroup 负责对子 View 逐个进行布局。

绘制阶段:通过 draw()、onDraw() 和 dispatchDraw(),将 View 绘制到屏幕上。

  • draw(Canvas):包含整个绘制流程。
  • onDraw(Canvas):绘制当前 View 的内容,子类可重写。
  • dispatchDraw(Canvas):负责绘制子 View。

绘制顺序:绘制背景。绘制自身内容(onDraw)。绘制子 View(dispatchDraw)。绘制滚动条等装饰。

补充细节

  • ViewGroup 特殊性:ViewGroup 需要遍历子 View 进行测量、布局和绘制。
  • 无状态特性:View 本身是无状态的,状态管理需要依靠 invalidate() 或 requestLayout() 等方法触发重绘或重新布局。
  • 性能优化:避免过度绘制(Overdraw)。自定义 View 时合理使用 onMeasure() 和 onDraw()。

如果需要深入,面试官可能会问:

  • MeasureSpec 的具体含义。
  • 如何优化自定义 View 的绘制流程。
  • 如何理解 View 的无状态特性。

http://www.kler.cn/a/453986.html

相关文章:

  • 记录Linux Centos 7 安装PostgreSQL 16
  • JZ31 栈的压入、弹出序列
  • Windows脚本命令与Linux Bash脚本命令
  • xctf-WEB-新手练习区Exercise area-Writeup
  • 2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
  • BP回归-反向传播(Backpropagation)
  • 【git】配置ssh代理
  • 人工智能与大数据:商贸物流变革的双引擎与挑战应对
  • 软件设计与体系结构
  • 消费企业如何提升主动造血能力?会员精细化运营是关键!
  • 面试知识点汇总_05
  • linux提示结构需要清理
  • nodejs操作达梦数据库的封装
  • 基于YOLOV5+Flask安全帽RTSP视频流实时目标检测
  • 移植 OLLVM 到 Android NDK,Android Studio 中使用 OLLVM
  • 【开源免费】基于SpringBoot+Vue.JS植物健康系统(JAVA毕业设计)
  • 1847. 最近的房间
  • 【OCR】数据集合集!
  • 操作002:HelloWorld
  • 使用EasyExcel来动态生成表头