10. LinearLayout RelativeLayout ConstraintLayout

demo

  • LinearLayout 子View测量一次,但是实现复杂的布局要使用嵌套
  • elativeLayout 子View测量两次,但是实现复杂的布局不用嵌套
  • ConstraintLayout既能减少布局嵌套又不会测量两次
    RelativeLayout.onmeasure方法中会对子控件测量两次,源码如下
 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     for (int i = 0; i < count; i++) {
            View child = views[i];
                measureChildHorizontal(child, params, myWidth, myHeight);
            }
        }
        
          for (int i = 0; i < count; i++) {
            final View child = views[i];
            measureChild(child, params, myWidth, myHeight);
          }
    }

注意

  1. 有一个细节一个View至少会被测量两次
    如下面一个布局文件
    根布局文件1
    LinearLayout被测量2次,View被测量2次
<LinearLayout>
   <View/>
</LinearLayout>

如下的布局文件
RelativeLayout被测量2次,因为View会被RelativeLayout测量两次,所以View被测量4次

<RelativeLayout>
   <View/>
</RelativeLayout>
  1. 对于垂直方向的LinearLayout,如果其layout_height="wrap_cont",而其子View的layout_width="match_parent",则子View会被测量两次。(水平方向的LinearLayout同理)
<LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
    </LinearLayout>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容