尽量用LinearLayout代替RelativeLayout
因为RelativeLayout会在onMeasure两次,这是为什么呢?
首先RelativeLayout中子View的排列方式是基于彼此的依赖关系,而这个依赖关系可能和布局中View的顺序并不相同,在确定每个子View的位置的时候,就需要先给所有的子View排序一下。又因为RelativeLayout允许A,B 2个子View,横向上B依赖A,纵向上A依赖B。所以需要横向纵向分别进行一次排序测量。
LinearLayout
与RelativeLayout相比LinearLayout的measure就简单明了的多了,先判断线性规则,然后执行对应方向上的测量。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mOrientation == VERTICAL) {
measureVertical(widthMeasureSpec, heightMeasureSpec);
} else {
measureHorizontal(widthMeasureSpec, heightMeasureSpec);
}
}
在LinearLayout 测量步骤中,暂时避开了lp.weight>0的子视图,测量时先不测量这些子视图,后面将把父视图剩余的高度按照weight值的大小平均分配给相应的子视图。
FrameLayout
FrameLayout中,子组件之间都是共享容器的空间;因为每次计算子组件的位置的时候,都是以容器的左右上下边界来为基础,然后加上或者减去子组件本身的左右上下边距;Framelayout里面的组件都是一层一层堆叠的,不存在互相依赖关系。
所以总体效率是 FrameLayout>LinearLayout>RelativeLayout;
ConstraintLayout的优点:
ConstraintLayout测量次数比较多,优势是减少布局的层级,减少过度绘制,提升帧数。
嵌套层数高的界面,ConstraintLayout可以减少布局嵌套深度,简单的界面ConstraintLayout和其它布局都差不多。