View的工作原理

1、ViewRoot和DecorView                                   

ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。

在Activity对象被创建后,会将DecorView添加到Window中,同时创建ViewRoot,将DecorView和ViewRoot关联起来。

View的绘制流程是从ViewRoot的performTraversals方法开始的,经过measure、layout和draw三个过程将View绘制出来。

measure测量View的宽和高layout用来确定View在父容器中的放置位置draw将View绘制在屏幕上。

DecorView为整个Window界面的最顶层View。

DecorView只有一个子元素为LinearLayout,代表整个Window界面,包含通知栏、标题栏和内容显示栏。LinearLayout有2个FrameLayout:标题栏和内容栏。

MeasureSpec:View的测量过程,决定了一个View的尺寸规格。

对于DecorView,其MeasureSpec由窗口的尺寸和其自身的LayoutParams来共同决定;

对于普通View,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来共同决定,MeasureSpec一旦确定后,onMeasure中就可以确定View的测量高和宽。

2、View的工作流程                                                  

View的工作流程主要值measure(测量宽、高)、layout(布局:确定最终宽、高和四个顶点的位置)、draw(绘制)这三大流程。

ViewGroup的measure过程:除了完成自己的measure过程外,还要遍历去调用所有子元素的measure方法。ViewGroup是一个抽象类,提供了一个measureChildren方法。

draw过程:绘制背景background.draw(canvas)、自己(onDraw)、children(dispatchDraw)、装饰(onDrawScrollBars)。

View的绘制过程的传递是通过dispatchDraw来实现,dispatchDraw会便利调用所有子元素的draw方法。

3、自定义View                                                       

自定义View是一个综合的技术体系,涉及View的层次结构、事件分发机制和View的工作原理等技术细节。

a、继承View重写onDraw方法;

b、继承ViewGroup派生特殊的Layout;

c、继承特定的View(比如TextView);

d、继承特定的ViewGroup(比如LinearL);(b更接近View的底层)

原文地址:https://www.cnblogs.com/fankongkong/p/7468843.html