ConstraintLayout允许您创建具有平面视图层次结构的大型复杂布局(不包含嵌套视图组)。这与RelativeLayout所有视图根据兄弟视图和父布局之间的关系进行布局相似,但它比RelativeLayoutAndroid Studio的布局编辑器更灵活,更易于使用。

所有的功能ConstraintLayout都可以直接从布局编辑器的可视化工具中使用,因为布局API和布局编辑器是专门为对方构建的。因此,您可以ConstraintLayout完全通过拖放而不是编辑XML 来构建布局。

影片地址(https://youtu.be/XamMbnzI5vE

ConstraintLayout可在与Android 2.3(API级别9)及更高版本兼容的API库中提供。本页面提供了使用ConstraintLayoutAndroid Studio 3.0或更高版本构建布局的指南。如果您想了解更多关于布局编辑器的信息,请参阅Android Studio指南以使用布局编辑器构建UI。

要查看您可以创建的各种布局ConstraintLayout,请查看GitHub上的约束布局示例项目

约束概述


要定义视图的位置ConstraintLayout,您必须为视图添加至少一个水平和垂直约束。每个约束表示与另一个视图,父布局或不可见指南的连接或对齐。每个约束定义视图沿着垂直或水平轴的位置; 所以每个视图对于每个轴必须至少有一个约束,但通常更多是必要的。

将视图拖放到布局编辑器中时,即使它没有约束,它仍然保留在离开它的位置。但是,这只是为了使编辑更容易; 如果在设备上运行布局时视图没有约束,则它将在[0,0]位置(左上角)绘制。

在图1中,编辑器中的布局看起来不错,但对视图C没有垂直约束。当此布局在设备上绘制时,视图C水平地与视图A的左边缘和右边缘对齐,但出现在视图C的顶部因为它没有垂直限制。
【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图1.编辑器在A下面显示视图C,但它没有垂直约束

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图2.视图C现在被垂直约束在视图A下方

虽然缺少约束不会导致编译错误,但布局编辑器会将缺少的约束作为工具栏中的错误进行指示。要查看错误和其他警告,请单击显示警告和错误 。为了帮助您避免缺少约束,布局编辑器可以使用Autoconnect为您自动添加约束,并推断约束特征。

将ConstraintLayout添加到您的项目中


要ConstraintLayout在您的项目中使用,请按以下步骤操作:
确保您maven.google.com的模块级build.gradle文件中声明了存储库 :

repositories {
    maven {
        url 'https://maven.google.com'
    }
}

将库作为依赖项添加到同一个build.gradle文件中:

dependencies {
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
}

在工具栏或同步通知中,点击将项目与Gradle文件同步。

现在您已准备好用您的布局来构建布局ConstraintLayout。

转换布局

要将现有布局转换为约束布局,请按照下列步骤操作:

在Android Studio中打开布局,然后单击编辑器窗口底部的设计选项卡。
在Component Tree窗口中,右键单击布局,然后单击Convert layout to ConstraintLayout。
【Interface&navigation】ConstraintLayout构建响应式用户界面(3)

图3.将布局转换为的菜单ConstraintLayout

创建一个新的布局

要启动新的约束布局文件,请按照下列步骤操作:

  1. 在项目窗口中,单击模块文件夹,然后选择 文件>新建> XML>布局XML。
  2. 输入布局文件的名称并为根标签输入“android.support.constraint.ConstraintLayout” 。
  3. 点击完成。

添加或删除约束


要添加约束,请执行以下操作:

视频1.视图的左侧限制在父级的左侧

将一个视图从Palette窗口拖到编辑器中。

当您在a中添加视图时ConstraintLayout,它会显示一个边界框,其中每个角上都有正方形大小调整控制柄,每边都有圆形约束控制柄。

点击视图以选择它。
执行以下操作之一:
单击约束句柄并将其拖到可用的锚点(另一个视图的边缘,布局的边缘或指南)。
点击属性窗口 顶部视图检查器中的创建连接 。

创建约束时,编辑器会为其分配两个视图的 默认边距。

d
视频1.视图的左侧限制在父级的左侧

创建约束时,请记住以下规则:

每个视图必须至少有两个约束:一个水平和一个垂直。
您只能在约束句柄和共享同一平面的锚点之间创建约束。因此,一个视图的垂直平面(左侧和右侧)可以仅限于另一个垂直平面; 基线只能限制到其他基线。
每个约束句柄只能用于一个约束,但您可以创建多个约束(从不同的视图)到同一个锚点。

要移除约束,请选择视图,然后单击约束手柄。或者通过选择视图然后单击删除约束 来删除所有约束。

如果在视图上添加相反的约束条件,那么约束线会像弹簧一样变得扭曲,以指示相反的力,如视频2所示。当视图大小设置为“固定”或“包装内容”时,效果最明显在这种情况下,视图集中在约束之间。如果您希望视图伸展其大小以满足约束,请将大小切换为“匹配约束” ; 或者如果要保留当前大小但移动视图以使其不居中,请调整约束偏差。

您可以使用约束来实现不同类型的布局行为,如以下各节所述。

TODO:视频待续。。。
视频2.添加一个反对现有的约束

父的位置

将视图的一侧限制到布局的相应边缘。

在图4中,视图的左侧连接到父布局的左侧边缘。您可以定义边距与边距的距离。
【Interface&navigation】ConstraintLayout构建响应式用户界面(3)

图4.父级的水平约束

订单位置

定义两个视图的外观顺序,垂直或水平。

在图5中,B被限制为始终在A的右侧,并且C被限制在A以下。但是,这些限制并不意味着对齐,因此B仍然可以上下移动。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图5.水平和垂直约束

对准

将视图的边缘与另一个视图的相同边缘对齐。

在图6中,B的左侧与A的左侧对齐。如果要对齐视图中心,请在两侧创建一个约束。

您可以通过从约束中向内拖动视图来抵消对齐。例如,图7显示了具有24dp偏移对齐的B. 偏移量由约束视图的边距来定义。

您也可以选择所有要对齐的意见,然后单击对齐 工具栏中选择对齐类型。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图6.一个水平对齐约束

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图7.偏移水平对齐约束

基线对齐

将视图的文本基线与另一个视图的文本基线对齐。

在图8中,B的第一行与A中的文字保持一致。

要创建基线约束,请选择要约束的文本视图,然后单击 视图下方出现的编辑基线 。然后单击文本基线并将该行拖到另一个基线。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图8.一个基线对齐约束

约束指南

您可以添加可限制视图的垂直或水平指南,该指南对应用用户不可见。您可以根据相对于版面边缘的dp单位或百分比在布局中定位指南。

要创建指南,请单击 工具栏中的指南 ,然后单击添加垂直指南 或添加水平指南。

拖动虚线以重新定位它,并单击指南边缘的圆以切换测量模式。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图9.限制于指南的视图

限制到一个障碍

与指南类似,屏障是您可以限制视图的无形线条。除了障碍没有定义自己的位置; 相反,屏障位置基于其中包含的视图的位置而移动。当您想要将视图限制为一组视图而非一个特定的视图时,这非常有用。

例如,图10显示视图C被限制在屏障的右侧。屏障被设置为视图A和视图B两者的“结束”(或者以从左到右布局的右侧)。因此,屏障根据视图A或视图B的右侧是否最远而移动对。

要创建屏障,请按照下列步骤操作:

  1. 单击工具栏中的指南 ,然后单击 添加垂直屏障或 添加水平屏障。
  2. 在“ 组件树”窗口中,在屏障内选择所需的视图并将其拖入屏障组件。
  3. 从组件树中选择屏障,打开 属性 窗口,然后设置barrierDirection。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)

图10.视图C被限制在一个屏障上,屏障根据视图A和视图B的位置/大小进行移动

现在,您可以从另一个视图创建一个约束到屏障。

您还可以限制屏障内部的视图。这样,即使您不知道哪个视图最长或最高,也可以确保屏障中的所有视图始终相互对齐。

您还可以在屏障内包含指南以确保屏障的“最小”位置。

使用ConstraintLayout构建响应式UI
ConstraintLayout允许您创建具有平面视图层次结构的大型复杂布局(不包含嵌套视图组)。这与RelativeLayout所有视图根据兄弟视图和父布局之间的关系进行布局相似,但它比RelativeLayoutAndroid Studio的布局编辑器更灵活,更易于使用。

所有的功能ConstraintLayout都可以直接从布局编辑器的可视化工具中使用,因为布局API和布局编辑器是专门为对方构建的。因此,您可以ConstraintLayout完全通过拖放而不是编辑XML 来构建布局。

ConstraintLayout可在与Android 2.3(API级别9)及更高版本兼容的API库中提供。本页面提供了使用ConstraintLayoutAndroid Studio 3.0或更高版本构建布局的指南。如果您想了解更多关于布局编辑器的信息,请参阅Android Studio指南以使用布局编辑器构建UI。

要查看您可以创建的各种布局ConstraintLayout,请查看GitHub上的约束布局示例项目。

约束概述
要定义视图的位置ConstraintLayout,您必须为视图添加至少一个水平和垂直约束。每个约束表示与另一个视图,父布局或不可见指南的连接或对齐。每个约束定义视图沿着垂直或水平轴的位置; 所以每个视图对于每个轴必须至少有一个约束,但通常更多是必要的。

将视图拖放到布局编辑器中时,即使它没有约束,它仍然保留在离开它的位置。但是,这只是为了使编辑更容易; 如果在设备上运行布局时视图没有约束,则它将在[0,0]位置(左上角)绘制。

在图1中,编辑器中的布局看起来不错,但对视图C没有垂直约束。当此布局在设备上绘制时,视图C水平地与视图A的左边缘和右边缘对齐,但出现在视图C的顶部因为它没有垂直限制。

图1.编辑器在A下面显示视图C,但它没有垂直约束

图2.视图C现在被垂直约束在视图A下方

虽然缺少约束不会导致编译错误,但布局编辑器会将缺少的约束作为工具栏中的错误进行指示。要查看错误和其他警告,请单击显示警告和错误 。为了帮助您避免缺少约束,布局编辑器可以使用Autoconnect为您自动添加约束,并推断约束特征。

将ConstraintLayout添加到您的项目中
要ConstraintLayout在您的项目中使用,请按以下步骤操作:

确保您maven.google.com的模块级build.gradle文件中声明了存储库 :
存储库{
maven {
url'https ://maven.google.com' } }

将库作为依赖项添加到同一个build.gradle文件中:
依赖{
编译'com.android.support.constraint:约束的布局:1.0.2' }
在工具栏或同步通知中,点击将项目与Gradle文件同步。
现在您已准备好用您的布局来构建布局ConstraintLayout。

转换布局

图3.将布局转换为的菜单ConstraintLayout

要将现有布局转换为约束布局,请按照下列步骤操作:

在Android Studio中打开布局,然后单击编辑器窗口底部的设计选项卡。
在Component Tree窗口中,右键单击布局,然后单击Convert layout to ConstraintLayout。
创建一个新的布局
要启动新的约束布局文件,请按照下列步骤操作:

在项目窗口中,单击模块文件夹,然后选择 文件>新建> XML>布局XML。
输入布局文件的名称并为根标签输入“android.support.constraint.ConstraintLayout” 。
点击完成。
添加或删除约束
要添加约束,请执行以下操作:

视频1.视图的左侧限制在父级的左侧

将一个视图从Palette窗口拖到编辑器中。

当您在a中添加视图时ConstraintLayout,它会显示一个边界框,其中每个角上都有正方形大小调整控制柄,每边都有圆形约束控制柄。

点击视图以选择它。
执行以下操作之一:
单击约束句柄并将其拖到可用的锚点(另一个视图的边缘,布局的边缘或指南)。
点击属性窗口 顶部视图检查器中的创建连接 。
创建约束时,编辑器会为其分配两个视图的 默认边距。

创建约束时,请记住以下规则:

每个视图必须至少有两个约束:一个水平和一个垂直。
您只能在约束句柄和共享同一平面的锚点之间创建约束。因此,一个视图的垂直平面(左侧和右侧)可以仅限于另一个垂直平面; 基线只能限制到其他基线。
每个约束句柄只能用于一个约束,但您可以创建多个约束(从不同的视图)到同一个锚点。
视频2.添加一个反对现有的约束

要移除约束,请选择视图,然后单击约束手柄。或者通过选择视图然后单击删除约束 来删除所有约束。

如果在视图上添加相反的约束条件,那么约束线会像弹簧一样变得扭曲,以指示相反的力,如视频2所示。当视图大小设置为“固定”或“包装内容”时,效果最明显在这种情况下,视图集中在约束之间。如果您希望视图伸展其大小以满足约束,请将大小切换为“匹配约束” ; 或者如果要保留当前大小但移动视图以使其不居中,请调整约束偏差。

您可以使用约束来实现不同类型的布局行为,如以下各节所述。

父母的位置
将视图的一侧限制到布局的相应边缘。

在图4中,视图的左侧连接到父布局的左侧边缘。您可以定义边距与边距的距离。

图4.父级的水平约束

订单位置
定义两个视图的外观顺序,垂直或水平。

在图5中,B被限制为始终在A的右侧,并且C被限制在A以下。但是,这些限制并不意味着对齐,因此B仍然可以上下移动。

图5.水平和垂直约束

对准
将视图的边缘与另一个视图的相同边缘对齐。

在图6中,B的左侧与A的左侧对齐。如果要对齐视图中心,请在两侧创建一个约束。

您可以通过从约束中向内拖动视图来抵消对齐。例如,图7显示了具有24dp偏移对齐的B. 偏移量由约束视图的边距来定义。

您也可以选择所有要对齐的意见,然后单击对齐 工具栏中选择对齐类型。

图6.一个水平对齐约束

图7.偏移水平对齐约束

基线对齐
将视图的文本基线与另一个视图的文本基线对齐。

在图8中,B的第一行与A中的文字保持一致。

要创建基线约束,请选择要约束的文本视图,然后单击 视图下方出现的编辑基线 。然后单击文本基线并将该行拖到另一个基线。

图8.一个基线对齐约束

约束指南
您可以添加可限制视图的垂直或水平指南,该指南对应用用户不可见。您可以根据相对于版面边缘的dp单位或百分比在布局中定位指南。

要创建指南,请单击 工具栏中的指南 ,然后单击添加垂直指南 或添加水平指南。

拖动虚线以重新定位它,并单击指南边缘的圆以切换测量模式。

图9.限制于指南的视图

限制到一个障碍
与指南类似,屏障是您可以限制视图的无形线条。除了障碍没有定义自己的位置; 相反,屏障位置基于其中包含的视图的位置而移动。当您想要将视图限制为一组视图而非一个特定的视图时,这非常有用。

例如,图10显示视图C被限制在屏障的右侧。屏障被设置为视图A和视图B两者的“结束”(或者以从左到右布局的右侧)。因此,屏障根据视图A或视图B的右侧是否最远而移动对。

要创建屏障,请按照下列步骤操作:

单击工具栏中的指南 ,然后单击 添加垂直屏障或 添加水平屏障。
在“ 组件树”窗口中,在屏障内选择所需的视图并将其拖入屏障组件。
从组件树中选择屏障,打开 属性 窗口,然后设置barrierDirection。
现在,您可以从另一个视图创建一个约束到屏障。

您还可以限制屏障内部的视图。这样,即使您不知道哪个视图最长或最高,也可以确保屏障中的所有视图始终相互对齐。

您还可以在屏障内包含指南以确保屏障的“最小”位置。

图10.视图C被限制在一个屏障上,屏障根据视图A和视图B的位置/大小进行移动

调整约束偏差


当您向视图的两侧添加约束(并且同一维的视图大小为“固定”或“包裹内容”)时,视图将变为居中于两个约束之间,默认情况下偏差为50%。您可以通过在“ 属性”窗口中拖动偏移滑块或拖动视图来调整偏差,如视频5所示。

如果您希望视图伸展其大小以满足约束,请将大小切换为“匹配约束”

TODO:视频5.调整约束偏差

使用ConstraintLayout构建响应式UI
ConstraintLayout允许您创建具有平面视图层次结构的大型复杂布局(不包含嵌套视图组)。这与RelativeLayout所有视图根据兄弟视图和父布局之间的关系进行布局相似,但它比RelativeLayoutAndroid Studio的布局编辑器更灵活,更易于使用。

所有的功能ConstraintLayout都可以直接从布局编辑器的可视化工具中使用,因为布局API和布局编辑器是专门为对方构建的。因此,您可以ConstraintLayout完全通过拖放而不是编辑XML 来构建布局。

ConstraintLayout可在与Android 2.3(API级别9)及更高版本兼容的API库中提供。本页面提供了使用ConstraintLayoutAndroid Studio 3.0或更高版本构建布局的指南。如果您想了解更多关于布局编辑器的信息,请参阅Android Studio指南以使用布局编辑器构建UI。

要查看您可以创建的各种布局ConstraintLayout,请查看GitHub上的约束布局示例项目。

约束概述
要定义视图的位置ConstraintLayout,您必须为视图添加至少一个水平和垂直约束。每个约束表示与另一个视图,父布局或不可见指南的连接或对齐。每个约束定义视图沿着垂直或水平轴的位置; 所以每个视图对于每个轴必须至少有一个约束,但通常更多是必要的。

将视图拖放到布局编辑器中时,即使它没有约束,它仍然保留在离开它的位置。但是,这只是为了使编辑更容易; 如果在设备上运行布局时视图没有约束,则它将在[0,0]位置(左上角)绘制。

在图1中,编辑器中的布局看起来不错,但对视图C没有垂直约束。当此布局在设备上绘制时,视图C水平地与视图A的左边缘和右边缘对齐,但出现在视图C的顶部因为它没有垂直限制。

图1.编辑器在A下面显示视图C,但它没有垂直约束

图2.视图C现在被垂直约束在视图A下方

虽然缺少约束不会导致编译错误,但布局编辑器会将缺少的约束作为工具栏中的错误进行指示。要查看错误和其他警告,请单击显示警告和错误 。为了帮助您避免缺少约束,布局编辑器可以使用Autoconnect为您自动添加约束,并推断约束特征。

将ConstraintLayout添加到您的项目中
要ConstraintLayout在您的项目中使用,请按以下步骤操作:

确保您maven.google.com的模块级build.gradle文件中声明了存储库 :
存储库{
maven {
url'https ://maven.google.com' } }

将库作为依赖项添加到同一个build.gradle文件中:
依赖{
编译'com.android.support.constraint:约束的布局:1.0.2' }
在工具栏或同步通知中,点击将项目与Gradle文件同步。
现在您已准备好用您的布局来构建布局ConstraintLayout。

转换布局

图3.将布局转换为的菜单ConstraintLayout

要将现有布局转换为约束布局,请按照下列步骤操作:

在Android Studio中打开布局,然后单击编辑器窗口底部的设计选项卡。
在Component Tree窗口中,右键单击布局,然后单击Convert layout to ConstraintLayout。
创建一个新的布局
要启动新的约束布局文件,请按照下列步骤操作:

在项目窗口中,单击模块文件夹,然后选择 文件>新建> XML>布局XML。
输入布局文件的名称并为根标签输入“android.support.constraint.ConstraintLayout” 。
点击完成。
添加或删除约束
要添加约束,请执行以下操作:

视频1.视图的左侧限制在父级的左侧

将一个视图从Palette窗口拖到编辑器中。

当您在a中添加视图时ConstraintLayout,它会显示一个边界框,其中每个角上都有正方形大小调整控制柄,每边都有圆形约束控制柄。

点击视图以选择它。
执行以下操作之一:
单击约束句柄并将其拖到可用的锚点(另一个视图的边缘,布局的边缘或指南)。
点击属性窗口 顶部视图检查器中的创建连接 。
创建约束时,编辑器会为其分配两个视图的 默认边距。

创建约束时,请记住以下规则:

每个视图必须至少有两个约束:一个水平和一个垂直。
您只能在约束句柄和共享同一平面的锚点之间创建约束。因此,一个视图的垂直平面(左侧和右侧)可以仅限于另一个垂直平面; 基线只能限制到其他基线。
每个约束句柄只能用于一个约束,但您可以创建多个约束(从不同的视图)到同一个锚点。
视频2.添加一个反对现有的约束

要移除约束,请选择视图,然后单击约束手柄。或者通过选择视图然后单击删除约束 来删除所有约束。

如果在视图上添加相反的约束条件,那么约束线会像弹簧一样变得扭曲,以指示相反的力,如视频2所示。当视图大小设置为“固定”或“包装内容”时,效果最明显在这种情况下,视图集中在约束之间。如果您希望视图伸展其大小以满足约束,请将大小切换为“匹配约束” ; 或者如果要保留当前大小但移动视图以使其不居中,请调整约束偏差。

您可以使用约束来实现不同类型的布局行为,如以下各节所述。

父母的位置
将视图的一侧限制到布局的相应边缘。

在图4中,视图的左侧连接到父布局的左侧边缘。您可以定义边距与边距的距离。

图4.父级的水平约束

订单位置
定义两个视图的外观顺序,垂直或水平。

在图5中,B被限制为始终在A的右侧,并且C被限制在A以下。但是,这些限制并不意味着对齐,因此B仍然可以上下移动。

图5.水平和垂直约束

对准
将视图的边缘与另一个视图的相同边缘对齐。

在图6中,B的左侧与A的左侧对齐。如果要对齐视图中心,请在两侧创建一个约束。

您可以通过从约束中向内拖动视图来抵消对齐。例如,图7显示了具有24dp偏移对齐的B. 偏移量由约束视图的边距来定义。

您也可以选择所有要对齐的意见,然后单击对齐 工具栏中选择对齐类型。

图6.一个水平对齐约束

图7.偏移水平对齐约束

基线对齐
将视图的文本基线与另一个视图的文本基线对齐。

在图8中,B的第一行与A中的文字保持一致。

要创建基线约束,请选择要约束的文本视图,然后单击 视图下方出现的编辑基线 。然后单击文本基线并将该行拖到另一个基线。

图8.一个基线对齐约束

约束指南
您可以添加可限制视图的垂直或水平指南,该指南对应用用户不可见。您可以根据相对于版面边缘的dp单位或百分比在布局中定位指南。

要创建指南,请单击 工具栏中的指南 ,然后单击添加垂直指南 或添加水平指南。

拖动虚线以重新定位它,并单击指南边缘的圆以切换测量模式。

图9.限制于指南的视图

限制到一个障碍
与指南类似,屏障是您可以限制视图的无形线条。除了障碍没有定义自己的位置; 相反,屏障位置基于其中包含的视图的位置而移动。当您想要将视图限制为一组视图而非一个特定的视图时,这非常有用。

例如,图10显示视图C被限制在屏障的右侧。屏障被设置为视图A和视图B两者的“结束”(或者以从左到右布局的右侧)。因此,屏障根据视图A或视图B的右侧是否最远而移动对。

要创建屏障,请按照下列步骤操作:

单击工具栏中的指南 ,然后单击 添加垂直屏障或 添加水平屏障。
在“ 组件树”窗口中,在屏障内选择所需的视图并将其拖入屏障组件。
从组件树中选择屏障,打开 属性 窗口,然后设置barrierDirection。
现在,您可以从另一个视图创建一个约束到屏障。

您还可以限制屏障内部的视图。这样,即使您不知道哪个视图最长或最高,也可以确保屏障中的所有视图始终相互对齐。

您还可以在屏障内包含指南以确保屏障的“最小”位置。

图10.视图C被限制在一个屏障上,屏障根据视图A和视图B的位置/大小进行移动

调整约束偏差
当您向视图的两侧添加约束(并且同一维的视图大小为“固定”或“包裹内容”)时,视图将变为居中于两个约束之间,默认情况下偏差为50%。您可以通过在“ 属性”窗口中拖动偏移滑块或拖动视图来调整偏差,如视频5所示。

如果您希望视图伸展其大小以满足约束,请将大小切换为“匹配约束”。

视频5.调整约束偏差

调整视图大小


您可以使用拐角手柄来调整视图大小,但是这会对大小进行硬编码,因此视图不会针对不同的内容或屏幕大小调整大小。要选择不同的尺寸模式,请单击视图并打开 编辑器右侧的“ 属性” 窗口。

在Attributes窗口的顶部附近是视图检查器,其中包含多个布局属性的控件,如图11所示(这仅适用于约束布局中的视图)。

您可以通过单击图11中标注为3的符号来更改高度和宽度的计算方式。这些符号表示大小模式,如下所示(单击符号以在这些设置之间切换):

修正:您可以在下面的文本框中指定特定的维度,或者在编辑器中调整视图的大小。
包裹内容:该视图只根据需要扩展以适应其内容。
匹配约束:视图尽可能扩展以满足各方的约束(在考虑视图边距后)。但是,您可以使用以下属性和值修改该行为(只有在将视图宽度设置为与约束匹配时,这些属性才会生效):
layout_constraintWidth_default
传播:尽可能扩大观点以满足双方的限制。这是默认行为。
wrap:仅根据需要展开视图以适应其内容,但仍然允许视图小于约束条件所需的视图。因此,这与使用Wrap Content(上面)的区别在于,将宽度设置为 Wrap Content会迫使宽度始终与内容宽度完全匹配; 而使用Match Constraints和 layout_constraintWidth_default设置为包装也允许视图小于内容宽度。
layout_constraintWidth_min
这需要dp视图的最小宽度的维度。

layout_constraintWidth_max
这需要dp维度来表示视图的最大宽度。

但是,如果给定维度只有一个约束,则该视图将展开以适应其内容。在高度或宽度上使用此模式还可以 设置尺寸比例。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图11.该属性窗口包括用于控制 1分尺寸比, 2删除约束, 3高度/宽度模式中, 4页边距和 5个约束偏压。

注意:你不能使用match_parent 任何视图ConstraintLayout。而是使用“匹配约束”(0dp)。

将大小设置为比率

如果至少有一个视图尺寸设置为“匹配约束”(0dp),则可以将视图尺寸设置为16:9等比例。为了使比,单击切换宽高比约束(标注1在图11中),然后进入 宽度:高度在出现的输入比。

如果宽度和高度都设置为与约束匹配,则可以单击 切换长宽比约束来选择基于另一维度的比例的维度。视图检查器通过用实线连接相应边缘来指示将哪个设置为比率。

例如,如果将双方设置为“匹配约束”,请单击 切换长宽比约束两次以将宽度设置为高度的比率。现在整个尺寸由视图的高度决定(可以用任何方式定义),如图12所示。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图12.视图设置为16:9宽高比,宽度基于高度比。

调整视图边距


为确保所有视图的间隔均匀,请单击工具栏中的“ 边距 ”以选择添加到布局的每个视图的默认边距。您对默认边距所做的任何更改仅适用于您从此之后添加的视图。

您可以通过单击表示每个约束的线上的数字(在图11中,标注4显示底部边距设置为24dp)来控制“ 属性”窗口中每个视图的边距。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图13.工具栏的Margin按钮。

该工具提供的所有边距均为8dp,以帮助您的视图与Material Design的8dp方形网格建议请添加链接描述保持一致 。

用链控制线性组


一个链是一组相互连接的视图,具有双向位置约束。链中的视图可以垂直或水平分布。

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图14.具有两个视图的水平链

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)
图15.每个链式样例

链可以通过以下方式之一进行设计:
传播:观看均匀分布(在占边界之后)。这是默认设置。
内部扩散:第一个和最后一个视图固定在链条两端的约束上,其余均匀分布。
加权:当链条设置为扩展或内部扩展时,可以通过将一个或多个视图设置为“匹配约束”(0dp)来填充剩余空间。默认情况下,空间均匀分布在设置为“匹配约束”的每个视图之间,但您可以使用layout_constraintHorizontal_weight和layout_constraintVertical_weight 属性为每个视图分配一个重要权重 。如果你熟悉layout_weight的 线性布局,这种工作方式相同。所以重量值最高的视图获得最多的空间; 具有相同重量的视图获得相同的空间量。
包装:意见打包在一起(利润率计算后)。然后,您可以通过更改链条的头部视图偏差来调整整个链条的偏差(左/右或上/下)。

链条的“头部”视图(水平链中最左边的视图和垂直链中最顶端的视图)用XML定义链条的样式。但是,您可以通过选择链中的任何视图,然后单击 视图下方显示的链式按钮 ,在点差,内部展开和打包之间进行切换。

要快速创建视图链,请全部选择它们,右键单击其中一个视图,然后选择“ 水平居中”或“ 居中垂直居中”,以分别创建水平链或垂直链。有关更多信息,请参阅以下视频:

TODO:视频4.从操作菜单创建链
使用链条时需要考虑的其他一些事情:

视图可以是水平链和垂直链的一部分,从而可以轻松地构建灵活的网格布局。
只有链条的每一端都限制在同一轴上的另一个对象时,链才能正常工作,如图14所示。
尽管链条的方向是垂直或水平的,但使用一个方向不会使视图在该方向上对齐。因此,请确保包含其他约束条件以实现链中每个视图的适当位置,例如对齐约束。

自动创建约束


将各个视图放置在布局中时,不必为每个视图添加约束,您可以将每个视图移动到您想要的位置,然后单击“ 约束约束” 以自动创建约束。

推断约束扫描布局以确定所有视图的最有效的一组约束。它尽最大努力将观点限制在当前位置,同时保持灵活性。您可能需要进行一些调整,以确保布局响应您打算的不同屏幕尺寸和方向。

Autoconnect是一个独立的功能,可以打开或关闭。打开时,它会在将每个视图添加到布局时自动创建两个或更多个约束,但只有在适合将视图约束到父布局时才会创建。Autoconnect不会为布局中的其他视图创建约束。

Autoconnect默认是禁用的。您可以通过在布局编辑器工具栏中单击打开自动连接 来启用它。

关键帧动画


https://youtu.be/OHcfs6rStRo
在a中ConstraintLayout,您可以使用ConstraintSet 和 TransitionManager为元素的大小和位置设置动画效果 。

注意:适用于Android 4.0(API级别14)或更高版本的支持库。 TransitionManager

A ConstraintSet是一个轻量级对象,表示a中所有子元素的约束,边距和填充 ConstraintLayout。当您将a ConstraintSet应用于显示时ConstraintLayout,布局会更新其所有子项的约束。

要使用ConstraintSets构建动画,请指定两个布局文件作为动画的开始和结束关键帧。然后,您可以ConstraintSet从第二个关键帧文件加载一个 并将其应用于显示的文件ConstraintLayout。

重要提示:约束设置动画仅对子元素的大小和位置进行动画处理。他们不会动画其他属性(如颜色)。

下面的代码示例显示了如何将单个按钮移动到屏幕底部。

// MainActivity.kt

fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.keyframe_one)
    constraintLayout = findViewById(R.id.constraint_layout) // member variable
}

fun animateToKeyframeTwo() {
    val constraintSet = ConstraintSet()
    constraintSet.load(this, R.layout.keyframe_two)
    TransitionManager.beginDelayedTransition();]
    constraintLayout.apply(constraintSet)
}
// layout/keyframe1.xml
// Keyframe 1 contains the starting position for all elements in the animation as well as final colors and text sizes

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
// layout/keyframe2.xml
// Keyframe 2 contains another ConstraintLayout with the final positions

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />
</android.support.constraint.ConstraintLayout>

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】ConstraintLayout构建响应式用户界面(3)