养成写技术文章的习惯!
做Android的开发的可能都知道RelativeLayout 的性能会比LinearLayout的性能好,但是为什么,不一定有人能答得的具体,可能大部分人都会说RelativeLayout因为比LinearLayout的计算要复杂,所以性能会差,balabalabala!!包括我自己也是这样,没有说到点子上。今天有同事问我,突然发现也说不上来,特意查了下google文档,在此记录下。
其实根本差别是:
主要在于Measure部分,在Layout与Draw部分,两者几乎没有什么太大的差别。
RelativeLayout在进行onMeasure的时候,会子View进行两次Measure,而LinearLayout只需Measure一次。
因为RelativeLayout允许两个组件在X和Y方向分别互相依赖,所以需要横向进行一次onMeasure,纵向进行一次onMeasure。而LinearLayout就不存在这种问题,因为它总是横向或者纵向的。但是,如果在LinearLayout中使用了layout_weight属性来设计View,那么同样也需要进行两次onMeasure。
下面看RelativeLayout的onMeasure方法中的详细代码:
for (int i = 0; i < count; i++) {  
            View child = views[i];  
            if (child.getVisibility() != GONE) {  
                LayoutParams params = (LayoutParams) child.getLayoutParams();  
                int[] rules = params.getRules(layoutDirection);  
  
                applyHorizontalSizeRules(params, myWidth, rules);  
                measureChildHorizontal(child, params, myWidth, myHeight);  
  
                if (positionChildHorizontal(child, params, myWidth, isWrapContentWidth)) {  
                    offsetHorizontalAxis = true;  
                }  
            }  
        }  
根据源码我们其实可以看到,RelativeLayout中对子View进行了两次Measure,一次是measureChildHorizontal,一次是measureChild。对子View先进行一次横向measure,之后再进行一次measure。
而我们再看LinearLayout的onMeasure方法:
@Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        if (mOrientation == VERTICAL) {  
            measureVertical(widthMeasureSpec, heightMeasureSpec);  
        } else {  
            measureHorizontal(widthMeasureSpec, heightMeasureSpec);  
        }  
    }  
它这个就十分简单了,要么measureVertical,要么measureHorizontal,计算相对来说简单很多。