RelativeLayout和LinearLayout性能PK笔记

有关于View的绘制流程,从ViewRoot的performTraversals()方法开始依次调用perfromMeasure,performLayout,perfromDraw这三个方法,这三个方法完成顶级View的measure,layout和draw三大绘制流程,其中perfromMeasure会调用measure,measure又会调用onMeasure,在onMeasure方法中会对所有子元素进行measure测量,这个时候measure流程就从父容器传递到子元素中,这样就完成了一次measure古城,接着子元素会重复父容器的measure,如此反复就完成了整个View树的遍历。同理,performLayout和performDraw也分别完成了perfromMeasure类似的流程,通过这三大流程,分别遍历整颗View树,就实现了Measure,layout,draw这一过程,view就绘制出来了。

理解,理解,理解 重要的事情说三遍!!!(有空去看源码吧)

这里没有源码,relativelayout分别对所有子view进行两次的测量,分别横纵向,这个是因为relativ排列的方式是基于彼此以来的关系,而这个依赖冠以可能和布局中的view的孙旭并不相同,在确定每个字view的位置的时候,首先给所有字view排序一下。有因为relativelayout允许A,B两个字view,横向上B依赖A,纵向上A依赖B。所以横向,纵向分别进行一次排序测量。

mSortedHorizontalChildren和mSortedVerticalChildren是分别对水平方向的子控件和垂直方向的子控件进行排序后的View数组。

线性布局只需要判断是水平还是垂直就进行测量,linearlayout首先会对所有子进行测量,并计算所有字view的weight属性进行布局,则不进行第二次测量

相对布局会让子view调用2次onMeasure,linerlayout在有weight时,也会调用view,2次onMeasure

在不影响层级深度的情况下,使用linnearlayout和framelayout而不是relativelayout

但是谷歌官方推荐的是relativelayout ,线性布局容易产生嵌套问题,relativelayout 优 但是现在谷歌推荐的是cl







阅读更多
换一批

没有更多推荐了,返回首页