Android view 基本的绘制流程

devtools/2025/1/1 14:21:45/

回答思路

概述
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.ppmy.cn/devtools/146476.html

相关文章

复习打卡大数据篇——Hadoop MapReduce

目录 1. MapReduce基本介绍 2. MapReduce原理 1. MapReduce基本介绍 什么是MapReduce MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。 MapRed…

使用PHP函数 “setcookie“ 设置cookie

在网站开发中,cookie是一种非常常用的技术,它用于在用户的浏览器中存储少量的数据,以便在不同页面之间传递信息。PHP提供了一个名为 "setcookie" 的函数,用于设置cookie的值和属性。在本文中,我们将学习如何…

每天40分玩转Django:Django部署概述

一、Django部署概述 在开发阶段,我们通常使用Django内置的轻量级开发服务器runserver。但在生产环境中,为了应对大量并发请求,需要使用高性能的WSGI服务器,如Gunicorn、uWSGI等。同时还要配置Nginx等Web服务器作为反向代理,实现负载均衡、静态文件处理等。下面是Django部署的整…

Rust语言的数据库编程

Rust语言的数据库编程 1. 引言 随着软件开发的不断进步,对高性能和安全性的要求也日益增加。Rust作为一门现代系统级编程语言,以其内存安全、并发性和性能优势逐渐受到开发者们的青睐。在数据库编程方面,Rust能否满足开发者的需求呢&#x…

Stable Diffusion 万字长文详解稳定扩散模型

1. Stable Diffusion 稳定扩散模型简介 Stable Diffusion 是 Diffusion 扩散模型中最先进的模式( Diffusion 有一些早期版本,比如: 原始Diffusion、Latent Diffusion)。它采用了更加稳定、可控和高效的方法来生成高质量图像。在生…

【框架篇】Spring MVC 介绍及使用(详细教程)

Spring MVC 介绍 1,MVC 设计模式 MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件: 模型(Model):模型是应用程序的数据和业务逻辑…

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时,Flask 会调用对应的视图函数来处理请求 def index():return …

pyqt和pycharm环境搭建

安装 python安装: https://www.python.org/downloads/release/python-3913/ python3.9.13 64位(记得勾选Path环境变量) pycharm安装: https://www.jetbrains.com/pycharm/download/?sectionwindows community免费版 换源: pip config se…