Android View的绘制流程分为三大流程:测量,布局,绘制
Activity通过Window与View关联,在Android中Window的实现是PhoneWindow,在PhoneWindow中存在DecorView,DecorView在Activity的onCreate生命周期的setContentView中初始化,其实DecorView就是一个ViewGroup,继承关系:DecorView->FrameLayout->ViewGroup。
对于视图的绘制在Activity的onResume生命周期后通过WindowManager的addView开始,被添加的View就是DecorView,WindowManager调用WindowManagerImpl,然后WindowManagerImpl通过桥接模式调用WindowManagerGloable的addView,在其中会创建ViewRootImpl终调用到ViewRootImpl的setView方法然后三大流程都是始于ViewRootImpl的performTravels函数,先是从调用View的PerformMeasure函数开始测量流程,再是调用performLayout函数开始布局流程,进而是调用performDraw函数开始绘制流程。
measure主要用于根据父类约束进行测量宽高值layout主要确认view的左上右下坐标位置draw用于对视图进行绘制,绘制流程包括:绘制背景色->绘制自己->分发绘制->绘制前景色及滚动条自定义
view需要注意的几个点:
1.自定义View时,需要考虑宽高wrap_content的情况,因为它的表现在测量阶段和match_parent是一致的
2.重写View的onDraw函数,要避免在onDraw创建对象,因为onDraw会被调用多次,可以考虑在onsizeChanged函数创建。
3.如果View会ViewGroup需要改变自身大小,应该在onMeasure函数实现,并通过setMeasureDimension保存下来。
4.重写ViewGroup的onDraw函数时,要注意onDraw函数在整个draw流程的地位,以及它并不是都会被调用