自定义View(View的绘制流程一)

背景

我们想要自定义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.png

这样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才会真正的显示在布局上 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容