【安卓基础重点知识7】ConstraintLayout

0 阅读16分钟

1. 前言

ConstraintLayout(约束布局)是一个 ViewGroup,它的出现是为了解决复杂布局时,布局嵌套过多导致绘制界面所需的时间增多的问题。它可以根据同级视图父布局的约束条件为每个视图定义位置。

除可以直接 XML 中编写属性以外,ConstraintLayout 支持直接在布局编辑器中拖动控件、添加约束,XML 布局中就会自动生成对应的属性。其中生成的一些属性,有可能并不是必须需要的,所以在生成后,还需要手动检查、清理。

2. 约束

要在 ConstraintLayout 中定义 View 的位置,必须为该 View 添加至少一个水平和一个垂直约束(否则该 View 就会在左上角绘制)。该约束对象可以是另一个视图,父布局(也就是 ConstraintLayout),或者是不可见的 Guideline 等

3. 使用

3.1 palette

左侧palette直接拖拽即可

3.2 添加约束

3.2.1 位置约束

  • 基本方向

简单的布局要求,即将组件添加到布局中,然后拖拽即可自动生成

//Bottom底、End、Start、Top上
<!-- 我的什么位置在谁的什么位置 -->
app:layout_constraintTop_toTopOf=""           我的顶部和谁的顶部对齐
app:layout_constraintBottom_toBottomOf=""     我的底部和谁的底部对齐
app:layout_constraintLeft_toLeftOf=""         我的左边和谁的左边对齐
app:layout_constraintRight_toRightOf=""       我的右边和谁的右边对齐
app:layout_constraintStart_toStartOf=""       我的开始位置和谁的开始位置对齐
app:layout_constraintEnd_toEndOf=""           我的结束位置和谁的结束位置对齐
 
app:layout_constraintTop_toBottomOf=""        我的顶部位置在谁的底部位置
app:layout_constraintStart_toEndOf=""         我的开始位置在谁的结束为止
<!-- ...以此类推 -->
  • 基线对齐
layout_constraintBaseline_toBaselineOf
  • 角度对齐

ConstraintLayout 还支持圆型定位,将一个控件的中心以一定的角度和距离约束到另一个控件的中心上,相当于在一个圆上放置一个控件

圆形定位主要通过以下三个属性值来控制

layout_constraintCircle:引用另一个控件的 id。
layout_constraintCircleRadius:到另一个控件中心的距离。
layout_constraintCircleAngle:控件的角度(顺时针,0 - 360 度)。

  • 百分比布局

ConstraintLayout 还支持控件的尺寸按照父布局尺寸的百分比来设置

app:layout_constraintWidth_percent 宽度占父布局百分比比例
app:layout_constraintHeight_percent 高度占父布局百分比比例

//必须将对应的height或者width设置为0才能生效
android:layout_width="0dp"
android:layout_height="0dp"

3.2.2 控件内边距、外边距、GONE Margin

<!--  外边距  -->
android:layout_margin="0dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
 
<!--  内边距  -->
android:padding="0dp"
android:paddingStart="0dp"
android:paddingLeft="0dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingRight="0dp"
android:paddingBottom="0dp" 

当依赖的目标view隐藏时会生效的属性,例如A被B依赖约束,当A隐藏时A会缩成一个点,
自身的margin效果失效,A设置的GONE Margin就会生效,属性如下
<!--  GONE Margin  -->
app:layout_goneMarginBottom="0dp"
app:layout_goneMarginEnd="0dp"
app:layout_goneMarginLeft="0dp"
app:layout_goneMarginRight="0dp"
app:layout_goneMarginStart="0dp"
app:layout_goneMarginTop="0dp"

当A没有隐藏时,app:layout_goneMarginStart="20dp"没有生效

当A隐藏时,才生效

3.2.3 控件尺寸

  • 尺寸限制

限制最大、最小宽高度,这些属性只有在给出的宽度或高度为wrap_content时才会生效,具体的属性如下:

android:minWidth=""   设置view的最小宽度
android:minHeight=""  设置view的最小高度
android:maxWidth=""   设置view的最大宽度
android:maxHeight=""  设置view的最大高度
  • 0dp(MATCH_CONSTRAINT)

0dp的作用会根据设置的类型而产生不同的作用,进行设置类型的属性是layout_constraintWidth_default和layout_constraintHeight_default,取值可为spread、percent、wrap。具体的属性及示例如下:

app:layout_constraintWidth_default="spread|percent|wrap"
app:layout_constraintHeight_default="spread|percent|wrap"

    spread:占用所有的符合约束的空间(默认)
    percent:自身view的尺寸是父布局尺寸的一定比例(50%,取值是0-1的小数)
             配合layout_constraintWidth_percent=“0.5”,写了这个,
             app:layout_constraintHeight_default="percent"可以省略
    wrap:匹配内容大小但不超过约束限制

效果对比

<TextView
    android:id="@+id/A"
    android:layout_width="wrap_content"
    android:layout_height="60dp"
    android:layout_marginStart="100dp"
    android:layout_marginTop="50dp"
    android:layout_marginEnd="100dp"
    android:background="@color/red"
    android:gravity="center"
    android:text="AAAAAAAAAAAAAAAAAA"
    android:textColor="@color/black"
    android:textSize="25sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_default="spread" />

<!--  宽度设置为0dp wrap模式  -->
<TextView
    android:id="@+id/B"
    android:layout_width="0dp"
    android:layout_height="60dp"
    android:layout_marginStart="100dp"
    android:layout_marginTop="150dp"
    android:layout_marginEnd="100dp"
    android:background="@color/green"
    android:gravity="center"
    android:text="BBBBBBBBBBBBBBBBBBBBBBB"
    android:textColor="@color/black"
    android:textSize="25sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_default="wrap" />
  • 设置宽高比例

当宽高至少有一项设置为 0dp 时(也就是 Match Constraints),那么我们就可以为该视图设置宽高比例。

layout_constraintDimensionRatio="3:1"

当height和width都设置为0dp,则在比率前面添加字母 W(用于限制宽度)或 H(用于限制高度),用逗号分隔:

app:layout_constraintDimensionRatio = "h,3:1"

3.3 chain

是一种特定的约束,一个链包含了多个视图,它允许链中的视图共享空间,并控制可用空间在它们之间如何分配

3.3.1 链式模式

layout_constraintHorizontal_chainStyle //横向
layout_constraintVertical_chainStyle   //纵向

  • spread:将可用空间以均匀分布的方式将视图放置在链中(默认模式):

  • spread_inside:将链中最外面的视图对齐到外边缘,然后在可用空间内均匀的放置链中的其他视图:

  • packed:将链中的视图紧紧的放在一起(可以提供边距让其分开),然后让其居中在可用空间内:

3.3.2 权重

Chains 还能对链中单独的视图控件设置 Weiget。因为目前并不支持在编辑器当中设置 Weiget,所以我们只能在布局中进行设置

layout_constraintHorizontal_weight
layout_constraintVertical_weight

将第一个Button填充剩余区域

android:layout_width="0dp"
app:layout_constraintHorizontal_weight="1"

3.4 辅助类

3.4.1 Guidelines

一条对实际显示界面不可见的线。用处是帮助我们的控件增加约束

通过Vertical Guideline或Horizontal Guideline添加垂直或水平的guideline

比如我们想让某个控件处在页面垂直位置的中间

Guidelines 可以切换百分比,或者是实际的距离

3.4.2 Barrier

Barrier和Guideline 一样,本身不可见,用户辅助布局。

假如有个这样的需求,页面中有个两个Button1和Button2,一个TextView3 ,现在需要让TextView3 处于Button1或Button2的右边,对齐Button1和Button2中较宽的控件。

如果将TextView3 的左边约束的加在Button1上,当Button2较宽时会挡住TextView3 ,在不用Barrier时,需要通过再增加一层布局将Button1和Button2放到布局中才能实现该需求。

新建一个垂直方向的barrier(Vertical Barrier)

将Barrier的barrierDerection属性设置成right,right属性表示其他控件对齐barrier控件中的靠右的控件

3.4.3 Group

Group 可以对一组的控件同时设置其可见性的值Visible、Invisible或者Gone

3.4.4 Placeholder(占位符)

Placeholder的作用就是占位,它可以在布局中占好位置,通过app:content=""属性,或者动态调用setContent()设置内容,来让某个控件移动到此占位符中

3.4.5 Flow(流式虚拟布局)

Flow是用于构建链的新虚拟布局,当链用完时可以缠绕到下一行甚至屏幕的另一部分。当不确定容器在运行时的大小,可以使用它来根据应用程序中的动态尺寸(例如旋转时的屏幕宽度)构建布局。

  • 使用
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ConstraintLayoutActivity">

    <TextView
        android:id="@+id/A"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="A"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/B"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/green"
        android:gravity="center"
        android:text="B"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/C"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="C"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/D"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/green"
        android:gravity="center"
        android:text="D"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/E"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="E"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/F"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="F"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/G"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="G"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/H"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="H"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/I"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:text="I"
        android:textColor="@color/black"
        android:textSize="25sp"
        android:textStyle="bold" />

    <androidx.constraintlayout.helper.widget.Flow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="A,B,C,D,E,F,G,H,I"
        app:layout_constraintTop_toTopOf="parent"
        app:flow_wrapMode="aligned"/>

</androidx.constraintlayout.widget.ConstraintLayout>
  • 链约束

Flow的constraint_referenced_ids关联的控件是没有设置约束的,这一点和普通的链是不一样的(控件可以以一种更灵活的方式排列,而不需要为每个控件单独设置具体的约束。这种排列方式允许控件根据Flow的规则自动调整位置,从而实现更动态和响应式的布局)

app:flow_wrapMode="none | chian | aligned" //设置排列方式

//当flow_wrapMode的值是chian或aligned时,
//我们还可以针对不同的链进行配置,这里就不一一展示效果了,具体的属性如下:
app:flow_horizontalStyle="packed|spread|spread_inside"  所有水平链的配置
app:flow_verticalStyle="packed|spread|spread_inside"    所有垂直链的配置
 
app:flow_firstHorizontalStyle="packed|spread|spread_inside" 第一条水平链的配置,其他条不生效
app:flow_firstVerticalStyle="packed|spread|spread_inside"   第一条垂直链的配置,其他条不生效
app:flow_lastHorizontalStyle="packed|spread|spread_inside"  最后一条水平链的配置,其他条不生效 
app:flow_lastVerticalStyle="packed|spread|spread_inside"    最后一条垂直链的配置,其他条不生效     
    
flow_horizontalGap   //设置水平方向的间隔
flow_verticalGap     //设置垂直方向的间隔

none(默认值):所有引用的view形成一条链,水平居中,超出屏幕两侧的view不可见

chian:所引用的view形成一条链,超出部分会自动换行,同行的view会平分宽度

aligned:所引用的view形成一条链,但view会在同行同列

  • 对齐约束

上面展示的都是相同大小的view,那么不同大小view的对齐方式,Flow也提供了相应的属性进行配置,(flow_wrapMode="aligned"时,我试着没有效果)

  • horizontal 水平排列,四种:center、bottom、top、baseline
app:flow_verticalAlign="center"

   app:flow_verticalAlign="bottom"

   app:flow_verticalAlign="top"

app:flow_verticalAlign="baseline"

  • vertical水平排列,三种:end、start、center
app:flow_horizontalAlign="end"

app:flow_horizontalAlign="center"

app:flow_horizontalAlign="start"

  • 数量约束

当flow_wrapMode属性为aligned和chian时,通过flow_maxElementsWrap属性控制每行最大的子View数量

app:flow_maxElementsWrap="3"

3.4.6 Layer

Layer继承自ConstraintHelper,常用来增加背景,或者共同动画,图层 (Layer) 在布局期间会调整大小,其大小会根据其引用的所有视图进行调整,代码的先后顺序也会决定着它的位置

<androidx.constraintlayout.helper.widget.Layer
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:padding="10dp"
    app:constraint_referenced_ids="AndroidImg,NameTv" />

<ImageView
    android:id="@+id/AndroidImg"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@drawable/rabbit"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/NameTv"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:gravity="center"
    android:text="rabbit"
    android:textColor="@color/black"
    android:textSize="25sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="@id/AndroidImg"
    app:layout_constraintStart_toStartOf="@id/AndroidImg"
    app:layout_constraintTop_toBottomOf="@id/AndroidImg" />

当控件写在Layer以后,则控件显示在layer上面,反之,Layer在最上面,进行了覆盖

3.4.7 ImageFilterButton & ImageFilterView

ImageFilterButton和ImageFilterView是两个控件,他们之间的关系就和ImageButton与ImageView是一样的。它们的大致作用有两部分,一是可以用来做圆角图片,二是可以叠加图片资源进行混合过滤。

  • 圆角图片
<androidx.constraintlayout.helper.widget.Layer
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/red"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:constraint_referenced_ids="rabbit"/>

<androidx.constraintlayout.utils.widget.ImageFilterView
    android:id="@+id/rabbit"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@drawable/rabbit"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:roundPercent="1" />
    
<!--    圆角 app:round,取值0-50dp,默认0,就是方形,
设置50就是圆形图片,超过50没其他意义,还是圆形图片。-->
<!--    圆角比例 app:roundPercent,取值0-1之间,默认0就是方形,1是圆形图片,
同上,超过1按照1处理,还是圆形图片。-->
   

  • 叠加图片资源进行混合

ImageFilterButton和ImageFilterView不但可以使用src来设置图片资源,还可以使用altSrc来设置第二个图片资源,altSrc提供的资源将会和src提供的资源通过crossfade属性形成交叉淡化效果,默认情况下,crossfade=0,altSrc所引用的资源不可见,取值在0-1

<androidx.constraintlayout.utils.widget.ImageFilterView
    android:id="@+id/view1"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:src="@drawable/rabbit"
    app:altSrc="@drawable/cat"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:crossfade="0.5"/>

除此之外,warmth属性可以用来调节色温,brightness属性用来调节亮度,saturation属性用来调节饱和度,contrast属性用来调节对比度

     <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="色温分别设置0、5、9"
        app:layout_constraintBottom_toTopOf="@+id/view2"
        app:layout_constraintTop_toTopOf="parent" />
        
    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view1"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toBottomOf="@id/view2"
        app:layout_constraintEnd_toStartOf="@+id/view2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/view2"
        app:warmth="0" />
        
    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view2"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toTopOf="@+id/view5"
        app:layout_constraintEnd_toStartOf="@+id/view3"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view1"
        app:layout_constraintTop_toTopOf="parent"
        app:warmth="5" />
        
    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view3"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toBottomOf="@id/view2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0"
        app:layout_constraintStart_toEndOf="@+id/view2"
        app:layout_constraintTop_toTopOf="@id/view2"
        app:warmth="9"
        tools:layout_editor_absoluteY="0dp" />
        
    <!--    亮度app:brightness=""-->
    <TextView
        android:id="@+id/textView8"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="亮度分别设置0、5、9"
        app:layout_constraintBottom_toTopOf="@+id/view5"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view2" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view4"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:brightness="0"
        app:layout_constraintBottom_toBottomOf="@id/view5"
        app:layout_constraintEnd_toStartOf="@+id/view5"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/view5"
        tools:layout_editor_absoluteY="136dp" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view5"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:brightness="5"
        app:layout_constraintBottom_toTopOf="@+id/view8"
        app:layout_constraintEnd_toStartOf="@+id/view6"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view4"
        app:layout_constraintTop_toBottomOf="@+id/view2" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view6"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:brightness="9"
        app:layout_constraintBottom_toBottomOf="@id/view5"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view5"
        app:layout_constraintTop_toTopOf="@id/view5"
        tools:layout_editor_absoluteY="136dp" />

<!--    饱和度 app:saturation-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="饱和度分别设置0、5、9"
        app:layout_constraintBottom_toTopOf="@+id/view8"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view5" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view7"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toBottomOf="@id/view8"
        app:layout_constraintEnd_toStartOf="@+id/view8"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/view8"
        app:saturation="0"
        tools:layout_editor_absoluteY="285dp" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view8"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toTopOf="@+id/view11"
        app:layout_constraintEnd_toStartOf="@+id/view9"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view7"
        app:layout_constraintTop_toBottomOf="@+id/view5"
        app:saturation="5" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view9"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:layout_constraintBottom_toBottomOf="@id/view8"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view8"
        app:layout_constraintTop_toTopOf="@id/view8"
        app:saturation="9"
        tools:layout_editor_absoluteY="296dp" />

<!--    对比度app:contrast-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="饱和度分别设置0、5、9"
        app:layout_constraintBottom_toTopOf="@+id/view11"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view8" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view10"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:contrast="0"
        app:layout_constraintBottom_toBottomOf="@id/view11"
        app:layout_constraintEnd_toStartOf="@+id/view11"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/view11"
        tools:layout_editor_absoluteY="437dp" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view11"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:contrast="5"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/view12"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view10"
        app:layout_constraintTop_toBottomOf="@+id/view8" />

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/view12"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:src="@drawable/rabbit"
        app:contrast="9"
        app:layout_constraintBottom_toBottomOf="@id/view11"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/view11"
        app:layout_constraintTop_toTopOf="@id/view11"
        tools:layout_editor_absoluteY="437dp" />

3.5 自动添加约束

  • Autoconnect:这是一个独立的功能,默认是关闭的。我们可以开启它,开启后,它将自动为新添加的视图创建两个或者更多的约束。其他的视图则不会自动添加

  • Infer Constraints:为当前所有的视图自动添加约束

3.6 Attributes

点击控件或者布局,右侧Attributes中展示所有属性

  • 四个原点用于删除约束,方框内代表着大小控制方式

其中wrap_content:

固定长度:

Match Constraints(有点类似于 match_parent):

本系列【安卓基础重点知识】是刚开始学习android的时候记录的,其中部分内容来自网页,忘记记录来源了,如需添加引用,联系我即可