对View绘制的初步认识

 

     刚刚开始对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(),总之当我们在执行某个ViewonDraw()方法时,view不一定会重绘,由父控件检测当前view的状态是否有动画,透明度,以及view所在window的矩形框是否改变了,如果发现有变化,那么才会进行重绘,可以发现,关于view的增加,删除,更新,设置动画,隐藏,展现,都会触发重绘动作。

 

 

 

 


相关文章: