美文网首页
RelativeLayout 和LinearLayout性能差别

RelativeLayout 和LinearLayout性能差别

作者: 老鱼简书 | 来源:发表于2018-04-04 11:02 被阅读0次

    养成写技术文章的习惯!

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

    相关文章

      网友评论

          本文标题:RelativeLayout 和LinearLayout性能差别

          本文链接:https://www.haomeiwen.com/subject/vfhkhftx.html