ConstraintLayout 更灵活的布局方式

本文深入讲解了ConstraintLayout的高级特性,包括View之间的圆形关系设定、强制布局约束、链式布局、填充父布局约束等技巧,并介绍了Guideline、Barrier、Group等组件的应用场景。
官方定义

A ConstraintLayout is a ViewGroup which allows you to position and size widgets in a flexible way


  • 实现两个View之间的圆关系。有3个可以设置的参数:圆心,半径,角度。
<TextView
        android:id="@+id/tv_0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView 0"
        android:background="#86b5ce"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView 1"
        android:background="#479782"
        app:layout_constraintCircle="@id/tv_0"
        app:layout_constraintCircleRadius="100dp"
        app:layout_constraintCircleAngle="45"
        />
复制代码
  • 强制布局的约束性
app:layout_constrainedWidth="true"
app:layout_constrainedHeigth="true"
复制代码

不强制约束

强制约束

  • Chain
//在某个头结点设置属性
app:layout_constraintHorizontal_chainStyle="spread"
复制代码
  • 填充父布局约束

//以宽为例,宽设置为0dp,会填充整个父布局可用宽度。
android:layout_width="0dp"
app:layout_constraintWidth_percent="0.5"
//或者
app:layout_constraintWidth_min="100dp"
app:layout_constraintWidth_max="200dp"
复制代码
  • GoneMargin
//当控件的左边的约束不可见的时候,可以设置一个Margin来应对。
app:layout_goneMarginLeft="100dp"
复制代码
  • 设置控件宽高比
//宽度和高度中需要有一个设置为0dp,然后设置Ratio,形式为 若高为0dp,则 H,比例:比例
<ImageView
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintDimensionRatio="H,16:9" />
复制代码
  • 设置控件宽高比并且设置宽占父控件的比例。
//这种情况下默认是居中的。可以通过设置layout_constraintDimensionRatio来居左或者居右
<ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintHorizontal_bias="0"
        app:layout_constraintWidth_percent="0.5"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintDimensionRatio="H,16:9" />
复制代码

  • Guideline 不占空间,辅助线。可以设置在某个方向上固定高度的位置,或者固定比例的位置。
//使用Guideline来实现margin的比例控制
 <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.2" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.2" />

    <ImageView
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintDimensionRatio="H,16:9"
        app:layout_constraintLeft_toRightOf="@id/guideline2"
        app:layout_constraintTop_toBottomOf="@id/guideline" />
复制代码
  • Barrier在多个并列的控件边缘设置一个”阻碍“,始终在最边缘的控件边上,以应对并列控件最边缘控件产生变化的情况。
 <TextView
        android:id="@+id/tv_0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#86b5ce"
        android:text="TextView 0"
        android:visibility="visible"
        app:layout_goneMarginLeft="100dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#479782"
        android:text="TextView 11111111111111111111111"
        android:visibility="visible"
        app:layout_constraintLeft_toRightOf="@id/barrier"
         />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="0dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintTop_toBottomOf="@id/tv_0"
        app:layout_constraintDimensionRatio="H,16:9" />

    <android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="right"
        app:constraint_referenced_ids="tv_0,imageView" />
复制代码
  • Group 1.1新增 控制一组控件的可见性。可以让代码更整洁。
<android.support.constraint.Group
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="tv_0,imageView"
        android:visibility="gone"
        />
复制代码
  • PlaceHolder 1.1新增 先在布局添加一个PlaceHolder,后续通过setContentId设置View,然后View就会用PlaceHolder的参数来布局了。
 <android.support.constraint.Placeholder
        android:id="@+id/placeHolder"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintBottom_toBottomOf="parent"
        />
复制代码
  • ConstraintSet 是约束规则的合集,可以设置到一个ConstrainLayout上替换其原本的约束。
        setContentView(R.layout.activity_main);
        ConstraintLayout constraintLayout = findViewById(R.id.ct_root);
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(this, R.layout.temp);
        constraintSet.applyTo(constraintLayout);
        
    //activity_main.xml
    <TextView
        android:id="@+id/tv_0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#86b5ce"
        android:text="TextView 0"
        android:visibility="visible"
        app:layout_goneMarginLeft="100dp" />
    
    //tem.xml
    <TextView
        android:id="@+id/tv_0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView 0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
        
复制代码

左图为老布局,右图为新布局

使用建议
  • 可以用少量层数的LinearLayout和RelativeLayout完成的布局,不使用ConstraintLayout,因为布局嵌套层数少时,使用ConstraintLayout更消耗性能。
  • 当需要实现特殊要求时,比如百分比布局,固定宽高比,控件相同布局不同的页面等,使用ConstrantLayout可以比较方便的实现。
参考

转载于:https://juejin.im/post/5afd47885188256709616d07

<think> 首先,用户的问题是关于ConstraintLayout布局类型的介绍。他们想知道ConstraintLayout是什么类型的布局。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式,但这个问题是关于Android布局的,可能没有数学表达式,所以这个可能不适用。 - 独立公式使用$$...$$格式,同样可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 - 在用户可见层,确保回答基于提供的引用内容。 提供的引用内容: - 引用[1]: 讨论了ConstraintLayout的新特性,强调它用于流畅的布局构建。 - 引用[2]: 描述ConstraintLayout类似于相对布局,但灵活,适合平铺布局,不是层叠布局,常用于拖拽方式构建页面。 - 引用[3]: 提到在build.gradle中添加依赖,但主要是关于实践的。 用户的问题:"我想了解ConstraintLayout是什么类型的布局 请问ConstraintLayout布局的类型介绍" 所以,我需要基于引用回答ConstraintLayout的类型。 关键点从引用中: - 引用[2]说:约束布局(ConstraintLayout)与相对布局差不多,是创建一个应用后默认的布局方式,比相对布局灵活,一般用于平铺的布局(不适用于层叠布局)。 - 引用[1]补充:它用于全面总结ConstraintLayout的用法和特性。 - 引用[3]是关于依赖的,不太相关。 因此,ConstraintLayout是一种相对布局类型,但灵活,适用于平铺布局而不是层叠布局。 回答结构: 1. 澄清问题:解释ConstraintLayout的类型。 2. 基于引用提供信息。 3. 结构清晰:逐步解释。 4. 结束时生成相关问题。 5. 添加引用标识。 回答大纲: - 开头:直接回答ConstraintLayout的类型。 - 主体:详细解释,基于引用。 - 结尾:生成相关问题。 引用标识:在引用的内容末尾添加[^1]等。例如,引用来自[2],所以在提到类似相对布局时添加[^2]。 最终回答: - 用中文。 - 包括生成相关问题部分。 </think> 基于您的问题,我将逐步介绍ConstraintLayout的布局类型。ConstraintLayout是Android开发中一种高度灵活的布局管理器,它属于**相对布局类型**,但与传统的RelativeLayout相比,它提供了强大的约束机制和优化性能。以下是我的详细解释,基于相关引用内容。 ### ConstraintLayout布局类型介绍 1. **基本类型:相对布局的增强版** ConstraintLayout的核心设计类似于相对布局(RelativeLayout),因为它允许视图(View)之间通过相对关系(如对齐、间距)进行定位。例如,按钮A可以约束在按钮B的右侧,而不是绝对坐标定位。这使得布局自适应不同屏幕尺寸[^2]。 与相对布局不同的是,ConstraintLayout引入了精细的约束规则(如水平和垂直约束),并优化了性能,减少了布局嵌套问题[^1]。 2. **适用场景:平铺布局而非层叠布局** ConstraintLayout最适合用于**平铺布局**(即视图在二维平面中排列,而非重叠)。它不适合层叠布局(如FrameLayout那样视图堆叠)。这种特性使它成为构建复杂界面的首选,尤其是在响应式设计中[^2]。 在实际开发中,ConstraintLayout常通过Android Studio的拖拽工具实现,简化了布局构建过程[^1]。 3. **核心特性:约束驱动和灵活性** - **约束机制**:每个视图必须设置至少一个水平和垂直约束(例如,相对于父容器或其他视图),否则会退化为绝对定位,这可能导致布局错误[^2]。 - **附加特性**:支持参考线(Guideline)、屏障(Barrier)和链(Chain)等高级功能,帮助实现复杂的布局行为[^1]。 - **性能优势**:ConstraintLayout减少了视图层级,优化了测量和布局过程,相比RelativeLayout能提升渲染效率[^1]。 4. **使用前提:依赖添加** 在使用前,需要确保在项目的`build.gradle`文件中添加依赖,例如: ```gradle dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.0' } ``` 这确保了您可以使用ConstraintLayout的最新特性[^3]。 总结来说,ConstraintLayout是一种**相对布局的现代化演变**,专注于平铺式、响应式界面设计,适用于大多数Android应用界面。如果您有具体使用案例,我可以提供多指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值