养成写技术文章的习惯!
做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,计算相对来说简单很多。
网友评论