XML 属性
边缘约束
- app:layout_constraintStart_toStartOf:View左边与某 View 左边对齐
- app:layout_constraintStart_toEndOf:View 左边与某 View 右边对齐
- app:layout_constraintEnd_toStartOf:View 右边与某 View 左边对齐
- app:layout_constraintEnd_toEndOf:View 右边与某 View 右边对齐
- app:layout_constraintTop_toTopOf:View 上边与某 View 上边对齐
- app:layout_constraintTop_toBottomOf:View 上边与某 View 下边对齐
- app:layout_constraintBottom_toTopOf:View 下边与某 View 上边对齐
- app:layout_constraintBottom_toBottomOf:View 下边与某 View 下边对齐
- app:layout_constraintBaseline_toBaselineOf:View 与某 View 的基线对齐
注:四边的 margin 只有设置了边缘约束才会生效,左右或者上下的约束成对创建会产生居中效果
辅助约束
引导线约束Guideline
宽高属性是无效的,因为这个并不画到屏幕上
<!-- 垂直分割引导线(百分比):将空间平分成左右两份 --><android.support.constraint.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_percent="0.5" /><!-- 垂直分割引导线(数值):距离左边 20dp 位置添加分割线 --><android.support.constraint.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_begin="20dp" /><!-- 垂直分割引导线(数值):距离右边 20dp 位置添加分割线 --><android.support.constraint.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_end="20dp" />
水平引导线只需要将 android:orientation="vertical" 修改为 android:orientation="horizontal" 即可
屏障约束Barrier
<!-- 根据 tv1 和 tv2 添加屏障约束,屏障位置为两个 view 的最右边(end) --><android.support.constraint.Barrierandroid:id="@+id/barrier"android:layout_width="wrap_content"android:layout_height="wrap_content"app:barrierDirection="end"app:constraint_referenced_ids="tv1,tv2"/>
注:就算退 tv1 和 tv2 的宽度改变屏障约束的位置还是会在两个 view 的最右边( app:barrierDirection="end" ,end:右边,start:左边,top:上边,bottom:下边)
bias偏移约束
app:layout_constraintHorizontal_bias="0" 水平偏移app:layout_constraintVertical_bias="0" 垂直偏移
默认情况下同时设置左右约束会有居中效果, 可通过 bias 来进行偏移
偏移值 0~1, 0 代表偏移到左侧, 1 代表偏移到右侧, 不设置时为默认值 0.5 (居中), 需要与约束方向相同
<TextViewandroid:id="@+id/tv1"android:layout_width="0dp"android:layout_height="100dp"android:text="text1"android:visibility="visible"app:layout_constraintDimensionRatio="h,1:2"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.3"app:layout_constraintTop_toTopOf="parent" />
比例宽高
app:layout_constraintDimensionRatio="1" 通过该属性可设置宽高比, 通过比例控制 View 的宽高, 注: 必须有一边是 **0dp** app:layout_constraintDimensionRatio="1" 以有值的一边为基准, 将另一边设置为 1 倍长度app:layout_constraintDimensionRatio="1:2" 以有值的一边为基准, 有值边的 1 倍长度等于另一边的 2 倍长度 app:layout_constraintDimensionRatio="h,1:2" 以 h (高度) 基准, w (宽度) 是 h 的 2 倍, 同理 w,1:2 就是以 w (宽度) 基准, 是 h (高度) w 的 2 倍
margin 属性
margin 属性需要通过对应的约束来实现, 在没有设置对应的约束时, margin 属性无效, 负值等同于 0dp
goneMargin 属性
与 margin 属性类似, 但需要对应约束 View 的 android:visibility="gone" , 才会生效
chainStyle 链条样式
- spread: 所有间距都相同( …view…view…view…)
- spread_inside: 中间间距都相同(view…view…view)
- packed: 集中到中间, 两边间距相同(…viewviewview…)
circle 属性
app:layout_constraintCircle="@+id/tv1"约束 Viewapp:layout_constraintCircleAngle="45"所在角度app:layout_constraintCircleRadius="150dp"距 View 中心点距离<TextView...app:layout_constraintCircle="@+id/tv1"app:layout_constraintCircleAngle="45"app:layout_constraintCircleRadius="150dp" />
constrainedWidth/constrainedHeight 相关(填充效果)
```xml
<a name="QihhO"></a>## 常用示例<a name="crwIn"></a>### 垂直居中```xml<TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" />
水平居中
<TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent" />
水平填充
<TextViewandroid:id="@+id/tv1"android:layout_width="0dp"android:layout_height="wrap_content"android:text="text1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent" /><!-- 或者 --><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constrainedWidth="true"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent" />
垂直填充
<TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="0dp"android:text="text1"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" /><!-- 或者 --><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constrainedHeight="true"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" />
居中且不超出
<!-- width/height 必须是 wrap_content --><!-- layout_constrainedWidth/layout_constrainedHeight 必须是 true --><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constrainedHeight="true"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent" />
参考线
将 TextView 布置到距离垂直中线右边 10dp 位置
<androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:orientation="vertical"app:layout_constraintGuide_percent="0.5"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"app:layout_constraintStart_toEndOf="@+id/guideline" />
垂直中线
<androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:orientation="vertical"app:layout_constraintGuide_percent="0.5"android:layout_width="wrap_content"android:layout_height="wrap_content" />
水平中线
<androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:orientation="horizontal"app:layout_constraintGuide_percent="0.5"android:layout_width="wrap_content"android:layout_height="wrap_content" />
距离参考线
<androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:orientation="horizontal"app:layout_constraintGuide_begin="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content" />
左侧距离参考线 app:layout_constraintGuide_begin="20dp"
右侧距离参考线 app:layout_constraintGuide_end="20dp"
屏障
在两个或多个 View 的右侧
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text2fdfdf"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/tv1" /><android.support.constraint.Barrierandroid:id="@+id/barrier"android:layout_width="wrap_content"android:layout_height="wrap_content"app:barrierDirection="end"app:constraint_referenced_ids="tv1,tv2" /><TextViewandroid:id="@+id/tv3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="text2fdfdf"android:layout_marginStart="10dp"app:layout_constraintStart_toEndOf="@+id/barrier" /></android.support.constraint.ConstraintLayout>
app:barrierDirection="end" 设置屏障方位 start, end, top, bottomapp:constraint_referenced_ids="tv1,tv2" 设置参考 ViewId
案例
案例 1
RecyclerView 高度自动调整, 最大不超过全屏高度减去具体值, 最小仅包裹 item
<androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#80000000" ><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="@dimen/sw_155"android:background="@color/base_white"app:layout_constrainedHeight="true"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1"tools:itemCount="10"tools:listitem="@layout/layout_item" /></androidx.constraintlayout.widget.ConstraintLayout>

上图为 itemCount 5 - 50 的效果
