ConstraintLayout(约束布局)中文文档

本文详细介绍了ConstraintLayout的使用,包括相对布局、边距、居中定位、可见性行为、尺寸约束、链式布局和虚拟助手对象等关键特性。适用于API9及以上版本的Android系统,文档会随着组件功能的完善而更新。
摘要由CSDN通过智能技术生成

ConstraintLayout(约束布局)中文文档

更新了Android Studio2.3 发现官方的模板里面已经开始使用这种布局了,所以去看了一下官方的文档,感觉这种布局可以更好的适配复杂的布局,下面是本人自己翻译的,凑活看,希望对大家有帮助。

本文翻译自谷歌的官方文档→ConstraintLayout

ConstraintLayout 是一种允许你以灵活的方式放置和排列组件的ViewGroup。

注意:ConstraintLayout 可用于API9(2.3)以上的Android系统,官方会在后续不断地完善这个组件,支持更多的功能,文档也会不断地更新。

现在可以使用如下几种constriant(约束):

Relative positioning 相对布局

Margins 边距

Centering positioning 居中

Visibility behavior 可见性

Dimension constraints 尺寸约束

Chains 链式

Virtual Helpers objects Virtual Helper对象

/*****************************************************************************/

Relative positioning 相对布局

相对定位是在ConstraintLayout创建布局的一种构建方法。这些约束可以给定部件相对于另一个位置。你可以约束一个部件在水平或者垂直轴:

- 水平轴: Left, Right, Start and End sides
- 垂直轴:top, bottom sides and text baseline(文本基线)

一般来说概念是约束给定部件的一个边和另一个其他部件的边。

举个栗子,为了放置按钮B右边的按钮(图1):

Relative positioning的例子

你需要这样:
<Button android:id="@+id/buttonA" ... />
         <Button android:id="@+id/buttonB" ...
                 app:layout_constraintLeft_toRightOf="@+id/buttonA" />
这样我们就告诉系统我们想把Button B的左面 约束在 ButoonA 的右面,这样放置约束说明系统会尝试双方共享相同的位置。    

下图是现有的各种约束: 

现有的约束

  • layout_constraintLeft_toLeftOf

  • layout_constraintLeft_toRightOf

  • layout_constraintRight_toLeftOf

  • layout_constraintRight_toRightOf

  • layout_constraintTop_toTopOf

  • layout_constraintTop_toBottomOf

  • layout_constraintBottom_toTopOf

  • layout_constraintBottom_toBottomOf

  • layout_constraintBaseline_toBaselineOf

  • layout_constraintStart_toEndOf

  • layout_constraintStart_toStartOf

  • layout_constraintEnd_toStartOf

  • layout_constraintEnd_toEndOf

他们都需要一个参考另一个组件的id,或者父( 引用的父容器,即ConstraintLayout ):

<Button android:id="@+id/buttonB" ...
                 app:layout_constraintLeft_toLeftOf="parent" />

Margins 边距

Constraint Margin

如果设置了侧边缘,他们将被应用到相应的Constriants(约束)(如果存在的话)(上图),执行margin作为目标和源端之间的空间。通常的布局margin属性可用于这种效果:
  • android:layout_marginStart

  • android:layout_marginEnd

  • android:layout_marginLeft

  • android:layout_marginTop

  • android:layout_marginRight

  • android:layout_marginBottom

注意!margin只能大于等于0

利用Margins连接一个GONE了的组件
当一个约束目标的可见性是View.GONE的时候,你也可以使用以下属性表示不同的margin值:
  • layout_goneMarginStart

  • layout_goneMarginEnd

  • layout_goneMarginLeft

  • layout_goneMarginTop

  • layout_goneMarginRight

  • layout_goneMarginBottom

Centering positioning 居中和偏移

ConstraintLayout的另一个有用的方面是如何处理“不可能”的约束。举个栗子,像这样:
<android.support.constraint.ConstraintLayout ...>
             <Button android:id="@+id/button" ...
                 app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintRight_toRightOf="parent/>
         </>
除非ConstraintLayout恰巧拥有相同大小的Button,所有的constraints(约束)都不能同时满足条件(官方希望他们两边都不能满足条件)。

居中布局

发生在这种情况下,约束向相反的方向将组件分开同(上图),这样组件最终会被居中在父容器。这将适用于垂直约束。
bias 偏移
默认时遇到这种相反的约束是居中布局组件;但是你可以调整位置倾向一方使用偏移属性:
  • layout_constraintHorizontal_bias
  • layout_constraintVertical_bias

偏移布局

举栗说明将左边的偏移量改为30%,而不是默认的50%,左侧会变短,组件将更倾向于左侧:
<android.support.constraint.ConstraintLayout ...>
             <Button android:id="@+id/button" ...
                 app:layout_constraintHorizontal_bias="0.3"
                 app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintRight_toRightOf="parent/>
         </>
使用偏移,您可以更好的适应屏幕大小变化来创建界面。

Visibility behavior 可见性

ConstraintLayout对被标记为View.GONE的组件有特殊的处理。

GONE掉的组件,像往常一样,不会被显示,不布局本身(即实际尺寸不会改变如果标记为GONE)。

但在计算布局方面,组件仍然是它的一部分,一个重要的区别:
  • For the layout pass, their dimension will be considered as if zero (basically, they will be resolved to a point)通过布局,他们的尺寸将被视为0(基本上,他们将被视为一个点)
  • 如果他们有约束其他的组件,那么他们仍然有效,只不过所有的margin都会变为0

可见性

上图是当ButtonA GONE掉的时候B的显示效果

这个特定的behavior允许构建布局,你可以暂时标记组件是GONE掉了,而不是破坏布局
,这样做简单布局动画时特别有用。

注意:margin在B已经定义一个与A的连接时才会生效。在某些情况下,这可能不是你想要的margin(如A有距离他父容器100 dp的margin,B到A只有16 dp,然后A消失掉的时候,B将margin父容器 16 dp)。出于这个原因,当一个组件被标记为GONE的时候,您可以指定一个替代margin值。

Dimensions constraints 尺寸约束

你可以自己定义ConstraintLayout本身的最小尺寸:
  • android:minWidth 最小的宽度
  • android:minHeight 最小的高度

    这些最小尺寸将被用于ConstraintLayout尺寸设置为WRAP_CONTENT的时候。

组件尺寸约束
组件的尺寸可以通过三种不同方式指定android:layout_width和android:layout_height:
1. 使用指定的尺寸(就像100dp这种具体的尺寸)
2. 使用WRAP_CONTENT,让组件自己计算大小
3. 使用0dp,相当于MATCH_CONSTRAINT

尺寸约束

前两个和其他布局类似。最后一个将调整组件的匹配的约束(见图,wrap_content(a),(b)是0 dp)。如果margin,他们将会重新计算((c)0dp)。

重点!!!:ConstraintLayout 中的组件是不支持MATCH_PARENT 的,如果想要相同的效果要使用MATCH_CONSTRAINT,相应的上下左右要约束在“父容器”上。

Ratio 比
您还可以定义一个组件的尺寸为比值。为了做到这一点,
你需要至少有一个尺寸被设置为0 dp(即。MATCH_CONSTRAINT),
并设置属性layout_constraintDimentionRatio给定比例。例如:
<Button  android:layout_width="wrap_content"
                   android:layout_height="0dp"
                   app:layout_constraintDimensionRatio="1:1" />
 将按钮的高度设置为与宽度相同。这个比例可以表达为:
  • 一个float值,代表宽度和高度之间的比率

  • 比率的形式“宽:高”

    如果将宽高都设置为MATCH_CONSTRAINT(0 dp),
    我们还可以使用比例。
    在这种情况下,系统设置最大的尺寸来满足所有约束和维护指定的长宽比。
    以另一个尺寸来约束一个特定的尺寸。
    你可以在前面 加W”或H,分别指定宽度或高度限制。
    举个例子,如果一个尺寸是受制于两个目标(如宽度为0 dp和居中中在父布局)我们可以声明哪一方应该约束,
    通过添加字母W(对于限制宽度)或H(限制高度)的比率,由逗号分开:

 <Button android:layout_width="0dp"
                   android:layout_height="0dp"
                   app:layout_constraintDimensionRatio="H,16:9"
                   app:layout_constraintBottom_toBottomOf="parent"
                   app:layout_constraintTop_toTopOf="parent"/>
这样就设置宽度约束父布局,然后高度以16:9的比例显示这个按钮

Chains 链式

Chains提供在一个轴(横向或纵向)类似group的行为。其他轴可以独立约束。
创建一个链
如果一组组件通过双向连接连接在一起,我们就可以认为是他们是一个链,(如下图,显示最小链,由两个组件组成)。

chains

链头 Chain heads
链是由属性集合的第一个元素控制(链的“头”):

链头

链中的边距

如果在指定的连接上有margin,他们将被参考。在传递链的时候,将扣除mragin来分配空间。

链的样式
当链的第一个元素设置属性layout_constraintHorizontal_chainStyle 或layout_constraintVertical_chainStyle,链的行为会根据指定的样式改变(默认为CHAIN_SPREAD)。
  • CHAIN_SPREAD – 元素会被展开 (默认)

  • Weighted chain – 在CHAIN_SPREAD模式中,如果有些组件设置为MATCH_CONSTRAINT,他们将分开可用空间

  • CHAIN_SPREAD_INSIDE – 相似,但链的端点不会散开

  • CHAIN_PACKED – 链的元素将被打包在一起。子元素水平或垂直偏移(bias)属性将影响元素的定位

权重链
链的默认行为是元素伸展相同的可用空间。
如果一个或多个元素使用MATCH_CONSTRAINT,他们将利用剩余的空间(等分)。
属性layout_constraintHorizontal_weight, 
layout_constraintVertical_weight将控制分布在空间的元素如何使用MATCH_CONSTRAINT。
例如,使用MATCH_CONSTRAINT链包含两个元素,
第一个元素使用的权重2,
第二个元素使用权重1,
占用的空间第一个元素将是第二个元素的两倍。

Virtual Helper objects 虚拟的Helper对象

在使用具体的功能之前,您还可以使用特殊的helper对象来帮助你对ConstraintLayout进行布局。目前,guideline象允许您创建水平和垂直位置相对于ConstraintLayout容器的guideline。组件可以定位约束他们这样的guideline。

更多guideline的详情可以参考:

guideline

本文翻译自谷歌的官方文档→ConstraintLayout

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值