RelativeLayout 和LinearLayout性能差别的原理是什么?

养成写技术文章的习惯!

做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,计算相对来说简单很多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容