ConstraintLayout完全解析1

使用ConstraintLayout构建响应式UI

ConstraintLayout允许您使用平面视图层次结构创建大型复杂布局(无嵌套视图组)。它类似于RelativeLayout根据兄弟视图和父布局之间的关系布置所有视图,但它比RelativeLayout更灵活,更容易使用通过搭配Android Studio的布局编辑器。

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

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

约束概述

要定义子view在ConstraintLayout中的位置,必须为子view添加至少一个水平约束和一个垂直约束。每个约束表示与另一个视图,父布局或不可见的GuideLine的连接或对齐。每个约束定义子view沿垂直轴或水平轴的位置; 因此每个子view必须在每个轴至少有一个约束,但通常需要更多。

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

在图1中,编辑器中的布局看起来很好,但是视图C上没有垂直约束。当此布局在设备上绘制时,视图C水平对齐视图A的左右边缘,但显示在顶部屏幕,因为它没有垂直约束。

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

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

虽然缺少约束不会导致编译错误,但布局编辑器会将缺少的约束指示为工具栏中的错误。要查看错误和其他警告,请单击“ 显示警告和错误”

img
。为了帮助您避免遗漏约束,布局编辑器可以使用Autoconnect和推断约束功能自动为您添加约束。

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

为了使c视图位置固定,则必须为其添加垂直约束,如图2.

将ConstraintLayout添加到项目中

要在你的项目中使用constraintLayout,请遵循以下步骤:

  1. 确保在你项目级别的build.gradle文件中声明了google仓库

    repositories {
        google()
    }
    
  2. 将库作为依赖项添加到Appbuild.gradle文件中,如下面的示例所示。请注意,最新版本可能与示例中显示的不同:

    dependencies {
        implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    }
    
  3. 在工具栏或同步通知中,单击“使用Gradle文件同步项目”

现在,您已准备好使用ConstraintLayout

转换布局

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

  1. 在Android Studio中打开布局,然后单击编辑器窗口底部的“ 设计”选项卡。
  2. 在“ 组件树”窗口中,右键单击布局,然后单击“ 将布局转换为ConstraintLayout”

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

创建一个新布局

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

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

添加或删除约束

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

  1. 将视图从“组件面板”窗口拖到编辑器中。

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

  2. 单击视图以选择它。

  3. 执行以下操作之一:

    • 单击约束手柄并将其拖动到可用的锚点(另一个视图的边缘,布局的边缘或指南)。
    • 单击 “ 属性”窗口顶部的视图检查器中的“ 创建连接”

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

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

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

要删除约束,请选择视图,然后单击约束句柄。或者通过选择视图然后单击“ 删除约束”删除所有约束

img

如果在视图上添加相反的约束,则约束线像弹簧一样变成波浪状以指示相反的力,如视频2所示。当视图大小设置为“固定”或“包裹内容”时,效果最明显。在这种情况下,视图以约束为中心。如果您希望视图扩展其大小以满足约束,请将大小切换为“匹配约束”; 或者如果要保持当前大小但移动视图使其不居中,请调整约束偏差

相对于父布局的位置

将视图的一侧约束到布局的相应边缘。

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

图4.父级的水平约束

相对于兄弟布局的位置

定义两个视图的外观顺序,纵向或横向。

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

图5.水平和垂直约束

对齐

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

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

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

您也可以选择所有要对齐的意见,然后单击对齐

img
工具栏中选择对齐类型。

图6.水平对齐约束 图7.偏移水平对齐约束

基线对齐

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

在图8中,B的第一行与A中的文本对齐。

要创建基线约束,请选择要约束的文本视图,然后单击 视图下方显示的“ 编辑基线

img
”。然后单击文本基线并将该线拖到另一个基线。

图8.基线对齐约束

相对于Guideline的约束

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

要创建指南,请单击 工具栏中的“指南”

img
,然后单击“ 添加垂直指南” 或“ 添加水平指南”

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

图9.一个约束于指南的视图

相对于Barrier的约束

Guideline 类似,Barrier 是一条不可见的线,您可以将视图限制为。除了障碍没有定义自己的位置; 相反,屏障位置根据其中包含的视图的位置移动。当您想要将视图约束到一组视图而不是一个特定视图时,这非常有用。

例如,图10显示视图C被约束到屏障的右侧。屏障设置为视图A和视图B的“结束”(或从左到右布局的右侧)。因此屏障移动取决于视图A或视图B的右侧是否最远对。

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

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

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

您还可以约束Barrier 的视图。这样,您可以确保屏障中的所有视图始终彼此对齐,即使您不知道哪个视图最长或最高。

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

barrier-constraint_2x.png

图10.视图C被约束到一个障碍,它根据视图A和视图B的位置/大小移动

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容