背景
我们想要自定义View那么首先就得先明白View的工作流程和原理,知道它是怎么绘制出的。
初始ViewRoot和DecorView
View的绘制主要是三大流程,measure,layout,draw这三个过程,那么View又是怎么与我们的Activity所关联起来的呢?
ViewRoot对应于ViewRootImpl类,他是连接WindowManager和DecorView的纽带,View的三大流程都是由它来完成的。当Activity创建的时候DecorView会被添加到Window里面,同时也会创建ViewRootImpl对象,并将这个对象与DecorView建立连接。
root = new ViewRootImpl(View.getContext(),display); root.setView(view,wparams,panelParentView);
perfromTraversals流程
View的绘制流程是从ViewRoot的preformTraversals方法开始的,他经过measure、layout、draw三个过程最终将View绘制出来,其中measure用来测量View的宽和高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制在屏幕上,主要流程如下:。
这样preformTraversals它就会依次调用 preformMeasure , preformLayout和preformDraw这三个方法,三个方法的流程分别从父容器传递到子容器,如此反复,就完成了整个View的遍历。
简单总结
measure决定了View的宽\高,Measure完成之后可以通用过getMeasureHeight和getMwasureWidth来获得View的高度和宽度,在几乎多有的情况下他就是View 最终的宽高,但是特殊情况除外,Layout的过程决定了View的四个定点的位置和实际的View的宽\高,完成之后可以通过 getTop,getBottom,getLeft,getRight来获取View四个方向上的坐标,并通过getWidth和getHeight来获得View的最终的宽高,Draw则决定了View的显示,只有draw方法完成之后View才会真正的显示在布局上 。