FrameLayout LinearLayout RelativeLayout 原理

文章讨论了在Android开发中,为何应尽量使用LinearLayout代替RelativeLayout,因为RelativeLayout在onMeasure过程中需要进行两次测量,其复杂性在于子View的依赖关系导致的额外排序计算。相比之下,LinearLayout的测量过程更直接,效率更高。FrameLayout的效率最高,因其子组件没有互相依赖,直接堆叠。因此,为了性能考虑,推荐使用FrameLayout>LinearLayout>RelativeLayout的顺序来选择布局。
摘要由CSDN通过智能技术生成

尽量用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和其它布局都差不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值