五、ConstraintLayout(约束布局)布局介绍

参考:ConstraintLayout官方文档

ConstraintLayout是一个ViewGroup它允许您以灵活的方式定位和调整小部件。
ConstraintLayout可以作为一个支持库,您可以在Android系统上使用API 9级(Gingerbread)。

目前可以使用各种类型的约束:

1.相对定位
2.边缘
3.定心定位
4.圆形定位
5.可见性行为
6.尺寸限制
7.链
8.虚拟助手对象
9.优化器

注意,约束中不能具有循环依赖关系。

开发指南

一.相对定位

相对定位是在约束布局中创建布局的基本构建块之一。这些约束允许您将给定的小部件相对于另一个小部件定位。可以在水平和垂直轴上约束小部件:

1.水平轴:左、右、起点和终点
2.垂直轴:顶部、底部和文本基线

一般的概念是将控件的给定边约束到任何其他窗口小部件的另一边。
例如,为了将按钮B定位到按钮A的右边:


相对定位.jpg

这告诉系统,我们希望按钮B的左侧被约束到按钮A的右侧。这样的位置约束意味着系统将试图使双方共享相同的位置。


相对定位约束.jpg

以下是可用约束的列表:

app:layout_constraintLeft_toLeftOf
app:layout_constraintLeft_toRightOf
app:layout_constraintRight_toLeftOf
app:layout_constraintRight_toRightOf
app:layout_constraintTop_toTopOf
app:layout_constraintTop_toBottomOf
app:layout_constraintBottom_toTopOf
app:layout_constraintBottom_toBottomOf
app:layout_constraintBaseline_toBaselineOf
app:layout_constraintStart_toEndOf
app:layout_constraintStart_toStartOf
app:layout_constraintEnd_toStartOf
app:layout_constraintEnd_toEndOf

他们都引用了id对于另一个小部件,或父母(它将引用父容器,即约束布局):

二、边缘
相对定位裕度.jpg

如果设置了边距,则它们将应用于相应的约束(如果存在),将边距强制为目标和源边之间的空间。 通常的布局边距属性可用于此效果:

android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom

当位置约束目标的可见性为View.GONE时,您还可以使用以下属性指示要使用的不同边距值:

app:layout_goneMarginStart
app:layout_goneMarginEnd
app:layout_goneMarginLeft
app:layout_goneMarginTop
app:layout_goneMarginRight
app:layout_goneMarginBottom
三、定心定位和偏置

ConstraintLayout是如何处理“不可能”的约束。例如,如果我们有这样的事情:


       

在这种情况下发生的事情是,约束的作用就像是相反的力量将小部件拉平; 这样小部件最终将在父容器中居中。 这同样适用于垂直约束。

偏压

遇到这种相反的约束时的默认设置是使窗口小部件居中; 但是您可以使用偏差属性调整定位以支持一侧而不是另一侧:

app:layout_constraintHorizontal_bias
app:layout_constraintVertical_bias
使用偏差定位定位.jpg

例如,以下将使左侧具有30%的偏差而不是默认的50%,使得左侧将更短,小部件更倾向于左侧:


    
五、可见性行为

像往常一样,GONE小部件不会显示,也不是布局本身的一部分(即如果标记为GONE,它们的实际尺寸将不会更改)。

对于布局传递,它们的尺寸将被视为零(基本上,它们将被解析为一个点)
如果他们对其他小部件有限制,他们仍然会受到尊重,但任何边距都会好像等于零


可见性行为.jpg

这种特定的行为允许构建布局,你可以临时标记小部件。GONE,不破坏布局,这在做简单布局动画时特别有用。

六、限制尺寸

约束布局的最小尺寸
你可以为ConstraintLayout本身定义最大和最小大小:

android:minWidth //设置布局的最小宽度
android:minHeight //设置布局的最小高度
android:maxWidth //设置布局的最大宽度
android:maxHeight //设置布局的最大高度

当其尺寸设置为WRAP_CONTENT时,ConstraintLayout将使用这些最小和最大尺寸。

控件大小约束

可以通过以3种不同的方式设置android:layout_width和android:layout_height属性来指定控件的大小:
1.使用特定值
2.使用WRAP_CONTENT,它将要求小部件计算其自身大小。
3.使用0dp,相当于“MATCH_CONSTRAINT”


控件大小约束.jpg

前两个以与其他布局类似的方式工作。 最后一个将以匹配所设置的约束的方式调整窗口小部件的大小((a)是wrap_content,(b)是0dp)。 如果设置了边距,则在计算中将考虑它们((c)中的0dp)。

重要说明:不建议对ConstraintLayout中包含的小部件使用MATCH_PARENT。 可以通过使用MATCH_CONSTRAINT来定义类似的行为,其中相应的左/右或上/下约束被设置为“parent”。
WRAP_CONTENT : 强制约束

如果维度设置为WRAP_CONTENT,则在1.1之前的版本中,它们将被视为文字维度 - 这意味着约束不会限制生成的维度。 虽然通常这足够(并且更快),但在某些情况下,您可能希望使用WRAP_CONTENT,但仍然强制执行约束以限制结果维度。 在这种情况下,您可以添加一个相应的属性:

app:layout_constrainedWidth="true|false"
app:layout_constrainedHeight="true|false"
MATCH_CONSTRAINT

当维度设置为MATCH_CONSTRAINT时,默认行为是使结果大小占用所有可用空间。 还有几个额外的修饰符:
layout_constraintWidth_min和layout_constraintHeight_min:将设置此维度的最小大小
layout_constraintWidth_max和layout_constraintHeight_max:将设置此维度的最大大小
layout_constraintWidth_percent和layout_constraintHeight_percent:将此维度的大小设置为父级的百分比

最小和最大

为min和max指示的值可以是Dp中的维度,也可以是“wrap”,它将使用与WRAP_CONTENT相同的值。

百分维数

要使用百分比,您需要设置以下内容:
1.尺寸应设置为MATCH_CONSTRAINT(0dp)
2.默认值应设置为app app:layout_constraintWidth_default =“percent”或app:layout_constraintHeight_default =“percent”
3.然后将layout_constraintWidth_percent或layout_constraintHeight_percent属性设置为0到1之间的值

比率

您还可以将窗口小部件的一个维度定义为另一个维度的比率。 为此,您需要将至少一个约束维度设置为0dp(即MATCH_CONSTRAINT),并将属性layout_constraintDimensionRatio设置为给定比率。 例如:

将按钮的高度设置为与其宽度相同。

该比率可表示为:
浮点值,表示宽度和高度之间的比率
“宽度:高度”形式的比率

如果两个尺寸都设置为MATCH_CONSTRAINT(0dp),您也可以使用比率。 在这种情况下,系统设置满足所有约束的最大尺寸并保持指定的纵横比。 要根据另一个的尺寸约束一个特定边,可以预先附加W,“或H,分别约束宽度或高度。例如,如果一个维度受两个目标约束(例如,宽度为0dp并且以父对象为中心) 你可以通过在比率前添加字母W(用于约束宽度)或H(用于约束高度)来指示哪一边应该被约束,用逗号分隔:

将按照16:9的比例设置按钮的高度,而按钮的宽度将匹配父项的约束

七、链

链在单轴(水平或垂直)上提供类似组的行为。另一个轴可以独立地约束。

创建链

一组小部件被认为是一个链,如果它们通过双向连接被连接在一起(参见图,显示最小链,带有两个小部件)。


链.jpg
链头

链由链的第一个元素(链的“头”)所设定的属性控制:


链头.jpg

头部是水平链最左边的小部件,也是垂直链最顶端的小部件。

链中的边距

如果在连接上指定了边距,则会考虑它们。 在扩散链的情况下,将从分配的空间中扣除边距。

链式

在链的第一个元素上设置属性layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle时,链的行为将根据指定的样式更改(默认为CHAIN_SPREAD)。

1.CHAIN_SPREAD - 元素将展开(默认样式)
加权链 - 在CHAIN_SPREAD模式下,如果某些小部件设置为2.MATCH_CONSTRAINT,它们将拆分可用空间
3.CHAIN_SPREAD_INSIDE - 类似,但链的端点不会分散
4.CHAIN_PACKED - 链的元素将被打包在一起。 然后,子项的水平或垂直偏差属性将影响打包元素的定位


链式.jpg
加权链

链的默认行为是在可用空间中平均分布元素。如果一个或多个元素使用MATCH_CONSTRAINT,它们将使用可用的空白空间(在它们之间平均分配)。 layout_constraintHorizo​​ntal_weight和layout_constraintVertical_weight属性将控制如何使用MATCH_CONSTRAINT在元素之间分配空间。例如,在使用MATCH_CONSTRAINT的包含两个元素的链上,第一个元素使用权重2,第二个元素使用权重1,第一个元素占用的空间将是第二个元素占用的空间的两倍。

边距和链条

在链中的元素上使用边距时,边距是相加的。

例如,在水平链上,如果一个元素定义了10dp的右边距,而下一个元素定义了5dp的左边距,则这两个元素之间产生的边距为15dp。

在计算链用于定位项目的剩余空间时,会同时考虑项目及其边距。剩余空间不包含边距。

8.虚拟助手对象

除了前面详述的内在功能之外,您还可以使用ConstraintLayout中的特殊帮助程序对象来帮助您进行布局。 目前,Guideline对象允许您创建相对于ConstraintLayout容器定位的水平和垂直指南。 然后可以通过将小部件限制为这样的指导来定位小部件。

9.优化器

在1.1中我们公开了约束优化器。 您可以通过将标记app:layout_optimizationLevel添加到ConstraintLayout元素来决定应用哪些优化。

none:不应用任何优化
standard :默认。 仅优化直接和屏障约束
direct:优化直接约束
barrier:优化障碍限制
chain:优化链约束(实验)
dimensions:优化维度度量(实验),减少匹配约束元素的度量数量

你可能感兴趣的:(五、ConstraintLayout(约束布局)布局介绍)