android view的讲解 之 View的工作原理(decorView,viewRoot讲解)(一)
View:安卓视觉呈现,当系统给我们View满足不了我们,我们想要更炫酷的效果,自定义View实现;
ViewRoot对应ViewRootmipl,他是连接windowManager和DecorView的纽带;
通过这个源码可知:创建ViewRootmipl对象,并将viewRootImpl和DecorVeiw建立连接。
2.1view的绘制流程 (Traversals)车我搜
view的绘制流程是由viewRoot的prefromTravesals方法开始,经过measure,layout,draw来
完成view的绘制;
prefromTravesals分别调用了preformMeasue(),preformLayout,preformDraw();
prefromMeausre调用meause方法,meause方法掉用onMeausre()方法,完成父容器向子元素
measure的流程,然后子元素重复父容器的meause流程,完成Veiw的测量;
preformLayout,preformDraw都是一样的;只不过preformDraw是通过dispathDraw方法完成的;
意义是相同的;
DecorView是一个顶级的view;
通过源码可以知道:DecorView是一个frameLayout. view的执行会先经过decorView,然后才是我们的view;
DecorView是整个应用的界面,里面有标题和content;
MeauseSpec在很大程度上决定View的尺寸规格,在测量过程中还受父容器的影响。
MeauseSpec需要LayoutParams和父容器一起决定view的MeauseSpec;
测量过程:
系统将view的LayoutParam根据父容器施加的规格转化为MeauseSpec,然后对其测量宽高;
MeauseSpec是一个32位的int值,高2位的SpecMode,低30位的SpecSize;
SpecMode是测量模式。SpecSize是测量尺寸规格;
(12(SpecMode).2323232323232323232323...(30位 SpecSize))
SpecMode有三个类
对于普通View是由父容器的MeasureSpec和LayoutParams来决定的,
View采用固定宽高时,不管父容器的MeasureSpec是什么,view的MeasureSpec都是精确模式;
大小并遵循LayoutParams中的大小。
view是match_Parent时。如果父容器是精确模式,那么view也是精确模式,大小是父容器的剩余空间。如果父容器是最大模式,view也是最大模式,大小不会超过父容器的剩余空间
view是wrap_content时。不管父容器是精确模式还是最大模式,view模式总是最大化,大小不超过父容器剩余空间。