LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景

FrameLayout忽略不说,因为很少用 ,不是很了解

 

LinearLayout、RelativeLayout两者绘制同样的界面时layout和draw的过程时间消耗相差无几,关键在于measure过程

RelativeLayout比LinearLayout慢了一些。我们知道ViewGroup是没有onMeasure方法的,这个方法是交给子类自己实现的。因为不同的ViewGroup子类布局都不一样,那么onMeasure索性就全部交给他们自己实现好了。

 

 RelativeLayout的onMeasure过程

根据源码我们发现RelativeLayout会根据2次排列的结果对子View各做一次measure。

首先RelativeLayout中子View的排列方式是基于彼此的依赖关系,在确定每个子View的位置的时候,需要先给所有的子View排序一下所以需要横向纵向分别进行一次排序测量。

 

LinearLayout的onMeasure过程

LinearLayout会先做一个简单横纵方向判断

需要注意的是在每次对child测量完毕后,都会调用child.getMeasuredHeight()/getMeasuredWidth()获取该子视图最终的高度,并将这个高度添加到mTotalLength中。

但是getMeasuredHeight暂时避开了lp.weight>0且高度为0子View,因为后面会将把剩余高度按weight分配给相应的子View。因此可以得出以下结论:

 

(1)如果我们在LinearLayout中不使用weight属性,将只进行一次measure的过程。(如果使用weight属性,则遍历一次wiew测量后,再遍历一次view测量)

(2)如果使用了weight属性,LinearLayout在第一次测量时获取所有子View的高度,之后再将剩余高度根据weight加到weight>0的子View上。

由此可见,weight属性对性能是有影响的。

 

所以(总结),

1)RelativeLayout慢于LinearLayout是因为它会让子View调用2次measure过程,而LinearLayout只需一次,但是有weight属性存在时,LinearLayout也需要两次measure。

2)在不响应层级深度的情况下,使用Linearlayout而不是RelativeLayout。

你可能感兴趣的:(Android的View及动画)