还是来从问题入手:在实现效果相同的情况下,线性布局和相对布局选择哪个?
relativelayout和linerlayout都是继承自ViewGroup,所以要比较view的性能还是要看onMeasure、onLayout、onDraw三个方法。有测试数据表示在加载相同布局情况下,linerlayout的onLayout、onDraw方法的执行时间和relativelayout差不多,但是liner的onMeasure()时间要短很多。既然出现了差异,那么就从源码角度具体分析。
首先来看RelativeLayout的OnMeasure()
上面代码只截取了核心的一部分,可以看到relativelayout对子view进行了两次measure,因为相对布局的子view是基于相对位置分布的,子view之间可能分别存在横向和纵向上依赖关系,所以需要在横向和纵向分别进行一次measure来确定view的位置,最后都会调用child.measure();
再来看LinerLayout的OnMeasure:
可以看出来linerlayout只针对布局方向进行了一次measure。
具体的看下measureVertical()方法
上面只截取了部分核心代码,可以看到如果子view的layout:weight>0且layout:height=0的时候,第一次measure跳过这些view,并设置标记位skippedMeasure为true,在后面对这些view进行第二次measure。同理,measureHorizontal()里的逻辑类似。
总结:
相同的布局情况下,relativet会对子View进行两次measure,liner只对子View进行一次measure,而在设置了weight时,也会对weight进行两次measure,所以一般情况下LinearLayout的性能要优于RelativeLayout。
如果view的层级嵌套过多,尽量使用relativelayout来降低层级,因为relative比较灵活而且层级结构比较扁平,很多liner的嵌套都可以用一个relative来代替。这也是Google推荐的方式(之前新建项目的布局都是relativelayout)。