天天看点

ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档

  • ConstraintLayout约束布局中文文档
      • Relative positioning 相对布局
      • Margins 边距
        • 利用Margins连接一个GONE了的组件
      • Centering positioning 居中和偏移
        • bias 偏移
      • Visibility behavior 可见性
      • Dimensions constraints 尺寸约束
        • 组件尺寸约束
        • Ratio 比
      • Chains 链式
        • 创建一个链
        • 链头 Chain heads
        • 链中的边距
        • 链的样式
        • 权重链
      • Virtual Helper objects 虚拟的Helper对象

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):
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
你需要这样:
           
<Button android:id="@+id/buttonA" ... />
         <Button android:id="@+id/buttonB" ...
                 app:layout_constraintLeft_toRightOf="@+id/buttonA" />
           
这样我们就告诉系统我们想把Button B的左面 约束在 ButoonA 的右面,这样放置约束说明系统会尝试双方共享相同的位置。    

下图是现有的各种约束: 
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
  • 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 边距

ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
如果设置了侧边缘,他们将被应用到相应的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(约束)都不能同时满足条件(官方希望他们两边都不能满足条件)。
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
发生在这种情况下,约束向相反的方向将组件分开同(上图),这样组件最终会被居中在父容器。这将适用于垂直约束。
           

bias 偏移

默认时遇到这种相反的约束是居中布局组件;但是你可以调整位置倾向一方使用偏移属性:
           
  • layout_constraintHorizontal_bias
  • layout_constraintVertical_bias
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
举栗说明将左边的偏移量改为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
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档

上图是当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
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档
前两个和其他布局类似。最后一个将调整组件的匹配的约束(见图,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的行为。其他轴可以独立约束。
           

创建一个链

如果一组组件通过双向连接连接在一起,我们就可以认为是他们是一个链,(如下图,显示最小链,由两个组件组成)。
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档

链头 Chain heads

链是由属性集合的第一个元素控制(链的“头”):
           
ConstraintLayout(约束布局)中文文档ConstraintLayout(约束布局)中文文档

链中的边距

如果在指定的连接上有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