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_simplescreen_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通过PhoneWindowDecorView相连,PhoneWindow又通过ViewRootImpl管理View层级。

  • PhoneWindow创建时机

    PhoneWindow是在Activity.attach中创建的。

  • 重新绘制触发

    通过requestLayoutinvalidate方法触发绘制流程。

  • requestLayout与invalidate区别

    requestLayout设置FORCE_LAYOUT标志,触发measure和layout,invalidate设置DIRTY标志,触发draw。

  • 三、详细流程分析

  • 首次绘制流程

    handleResumeActivity中,ActivityThread通过WindowManagerImpl.addView添加DecorViewViewRootImpl的创建和布局设置完成后,开始绘制流程。

  • ViewRootImpl创建与布局设置

    ViewRootImpl通过setView方法触发requestLayout,启动绘制流程。

  • LayoutInflate详解

    LayoutInflater通过解析布局文件,调用createViewFromTag生成View。FactoryFactory2决定了如何创建自定义View。

  • requestLayout流程

    requestLayout触发measure和layout,确保View大小和布局正确。

  • invalidate流程

    invalidate通过设置DIRTY标志,触发draw方法,进行部分或全局绘制。

  • 四、总结

    通过分析View的绘制流程和相关知识点,可以更深入地理解安卓系统的工作原理。这些知识点不仅有助于开发高效的UI组件,还能在面试中展示对系统机制的深刻理解。

    上一篇:人月神话札记:系统设计
    下一篇:阿里面试官没想到,一个CopyOnWriteArrayList,我都能跟他吹半小时

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2026年06月15日 15时33分31秒