对View绘制的初步认识
刚刚开始对View的认识,记录几个重要的概率与View绘制的流程。。
一、 概念:
1. PhoneWindow---- PhoneWindow这个类是Framework为我们提供的Android窗口的具体实现
2. decorView ----即contentParent ,视图的容器,它本质上是一个FrameLayout。每个应用程序窗口的decorView都有一个与之关联的ViewRoot对象
3. ViewRoot -----负责View的绘制。而ViewRootImpl为其实现类。
4. WindowManager ----维护decorView与ViewRoot关联
5. MeasureSpec ----代表了对decorView的宽高的约束信息。MeasureSpec是一个32位整数,由SpecMode和SpecSize两部分组成,其中,高2位为SpecMode,低30位为SpecSize。SpecMode为测量模式,SpecSize为相应测量模式下的测量尺寸
6. ViewGroup ----Android 中View充当具体可见的最小的基本单元, decorView也是ViewGruop,布局也是ViewGruop.
7. ViewManaer ----接口为字面理解view的具体管理者,提供了view的增,删,改接口,实现类为ViewGroup。
8. ViewParent -----定义了作为父视图应有功能的类. 是视图与父视图交互的接口,实现类ViewGroup
二、流程:
1.当我们调用setContentView时,实质上是调用了PhoneWindow的setContentView.其作用是运用LayoutInflater.inflate()加载Xml布局,当建立好了decorView与ViewRoot的关联后,ViewRoot类的requestLayout()方法会被调用,以完成应用程序用户界面的初次布局。实际被调用的是ViewRootImpl类的requestLayout()方法, 调用了scheduleTraversals()方法来调度一次完成的绘制流程,该方法会向主线程发送一个“遍历”消息,最终会导致ViewRootImpl的performTraversals()方法被调用。
2.View 的绘制
· measure: 判断是否需要重新计算View的大小,需要的话则计算;
· layout: 判断是否需要重新计算View的位置,需要的话则计算;
· draw: 判断是否需要重新绘制View,需要的话则重绘制。
绘制背景;
通过onDraw()绘制自身内容;
通过dispatchDraw()绘制子View;
绘制滚动条
3.绘制的时候,先看是否有绘制过的缓存,接着检测是否有动画,接着为我们的view创建矩形框,紧接着判断透明度,是否需要重绘等步骤,最后再进行invadate(),总之当我们在执行某个View的onDraw()方法时,view不一定会重绘,由父控件检测当前view的状态是否有动画,透明度,以及view所在window的矩形框是否改变了,如果发现有变化,那么才会进行重绘,可以发现,关于view的增加,删除,更新,设置动画,隐藏,展现,都会触发重绘动作。