Android-举一反三:12个View绘制流程高频面试题,带你全面理解View的绘制流程
发布日期:2021-04-30 21:09:29
浏览次数:120
分类:精选文章
本文共 1728 字,大约阅读时间需要 5 分钟。
View 绘制流程及相关知识点详解
安卓开发中,View是我们接触最多的组件之一。从面试官的角度来看,View的知识点是理解安卓系统工作原理的重要部分。本文将从绘制流程入手,逐步深入分析View的相关知识点。
一、绘制流程概述
View的绘制流程是measure -> layout -> draw。大家熟悉这个流程,但了解其背后的实现细节却是关键。
二、流程触发及相关组件
首次绘制流程触发
首次绘制发生在ActivityThread.handleResumeActivity中。该方法在活动恢复时调用,触发wm.addView,通过WindowManagerImpl添加DecorView,最终调用ViewRootImpl.setView,启动绘制流程。ViewRootImpl的创建
ViewRootImpl是在handleResumeActivity中创建的,它负责管理View的布局和事件。ViewRootImpl与DecorView关系
ViewRootImpl通过DecorView.assignParent将自身设置为DecorView的父节点。DecorView布局
DecorView的布局根据不同的WindowFeature设置,可能是screen_simple、screen_swipe_dismiss等,具体由PhoneWindow.installDecor中的generateLayout方法决定。DecorView创建时机
DecorView是在PhoneWindow.installDecor中通过generateDecor方法创建的。setContentView流程
setContentView首先调用PhoneWindow.setContentView,然后调用installDecor创建DecorView,最后通过LayoutInflater.inflate添加内容。LayoutInflate流程
LayoutInflater.inflate通过解析布局文件,调用createViewFromTag生成View。createViewFromTag会根据标签使用预设的Factory或默认方法创建View。Activity、PhoneWindow、DecorView、ViewRootImpl关系
Activity通过PhoneWindow与DecorView相连,PhoneWindow又通过ViewRootImpl管理View层级。PhoneWindow创建时机
PhoneWindow是在Activity.attach中创建的。重新绘制触发
通过requestLayout或invalidate方法触发绘制流程。requestLayout与invalidate区别
requestLayout设置FORCE_LAYOUT标志,触发measure和layout,invalidate设置DIRTY标志,触发draw。三、详细流程分析
首次绘制流程
在handleResumeActivity中,ActivityThread通过WindowManagerImpl.addView添加DecorView。ViewRootImpl的创建和布局设置完成后,开始绘制流程。ViewRootImpl创建与布局设置
ViewRootImpl通过setView方法触发requestLayout,启动绘制流程。LayoutInflate详解
LayoutInflater通过解析布局文件,调用createViewFromTag生成View。Factory和Factory2决定了如何创建自定义View。requestLayout流程
requestLayout触发measure和layout,确保View大小和布局正确。invalidate流程
invalidate通过设置DIRTY标志,触发draw方法,进行部分或全局绘制。四、总结
通过分析View的绘制流程和相关知识点,可以更深入地理解安卓系统的工作原理。这些知识点不仅有助于开发高效的UI组件,还能在面试中展示对系统机制的深刻理解。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2026年06月15日 15时33分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Oracle11G基本操作
2025-04-29
PayPal网站付款标准版(for PHP)
2025-05-01
Paystack Android SDK 集成与使用指南
2023-02-26
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
2023-02-27
php csv 导出
2023-02-27
php include和require
2023-02-27
php mysql优化方法_MySQL优化常用方法
2023-02-27
PHP OAuth 2.0 Server
2023-02-27
PHP pcntl_fork不能在web服务器中使用的变通方法
2023-02-27
php private ,public protected三者的区别
2023-02-27
php PSR规范
2023-02-27
php redis(2)
2023-02-27
PHP Redis分布式锁
2023-02-27
PHP SOAP模块的使用方法:NON-WSDL模式
2023-02-27
PHP SPL标准库-迭代器
2023-02-27
php zookeeper实现分布式锁
2023-02-27
PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
2023-02-27