Android之ConstraintLayout(依赖约束)布局

前言

Google 在推出 Android Studio 2.2预览版时,为开发者提供了一种新的布局,那就是 ConstraintLayout 布局,当时还不是正式版。但是在最近更新到 Android Studio 2.3之后,新建一个项目,打开 MainActivity 的布局文件,你会发现根布局不再是 RelativeLayout,而是 ConstraintLayout,可见 Google 对该布局看的还是挺重的。那我们就有必要去学习一下 ConstraintLayout 布局了。

ConstraintLayout 与 RelativeLatout 很像,控件之间根据依赖关系而存在,但它比 RelativeLayout 强大的多了,简直可以说是甩 RelativeLayout 几条街。ConstraintLayout 可以有效的解决布局嵌套过多导致的性能问题,并且 ConstraintLayout 支持可视化的方式编写布局,简直是爽爆了。

使用

确保你的 Android Studio 版本是2.2或者以上。如果你的 Android Studio 版本是 2.3 正式版,那么在你创建一个新项目时,你的 Activity 布局文件的根布局默认就是 ConstraintLayout。如果 AS 版本不是 2.3,需要在你的 app/build 文件中添加 ConstraintLayout 的依赖,如下:

compile 'com.android.support.constraint:constraint-layout:1.0.2'//正式版本

打开 res/layout/activity_main.xml 文件,由于是新建的项目,As 会自动帮我们创建好一个布局,如下图所示:(注意:我使用的 AS 版本是 2.3.1)

如果你用的 AS 版本低于 2.3,你只需要将布局转换为 ConstraintLayout 即可。如下图:

我们可以看到,现在主操作界面区域内又两个类似手机屏幕的界面,左边是预览界面,右边是蓝图界面。这两个界面都可以进行布局编辑操作,区别在于左边用于预览最终的界面效果,右边部分主要用于观察控件之间的约束情况。

基本操作

ConstraintLayout 支持可视化的方式编写界面,也就是说你完全可以以拖拽的方式来完成界面的布局。比如我们在界面添加一个 TextView 控件,那么我们只需在左侧 Palette 面板上拖一个 TextView 就可以了,如图所示:

一个 TextView 已经添加到界面了,但是由于我们没有为这个控件添加约束,当程序运行时,会自动位于界面左上角。

下面我们就为这个 TextView 控件添加约束吧。每个控件的约束分为垂直和水平两类,一共可以在四个方向上为控件添加约束,如下图所示:


上图中 TextView 的上下左右各有一个圆圈,这些圆圈就是用来添加约束的,我们可以将约束添加到 ConstraintLayout 上,也可以将约束添加到另一个控件。例如:我们想让这个 TextView 位于布局的正中央,那么就可以这样添加约束,如下图:

如上图,我们在 TextView 的上下左右分别添加了约束之后,TextView 会居中央显示。如果我们想让这个 TextView 居右上角显示,我们只需在上右上添加约束即可。如下图:

这就是添加约束最基本的方法了。

除此之外,我们还可以使用约束让一个控件相对于另一个控件定位。比如说,我们再添加一个TextView,让它位于第一个 TextView 的下方,上间距为 20dp ,操作如下图:

上面的间距我们可以拖动来控制,或者通过右边的 Properties 面板控制。我更倾向于右边的 Properties 面板,它比拖动能更精确控制间距的到小。

注意:当为控件添加约束条件时,最低需要添加两个约束条件(左上、左下、右上、右下),当你添加的约束条件不满足时,在 Text 页面,你的布局 XML 中就会有报红线的控件。

知道如何添加约束后,我们该怎样删除约束呢?其实删除约束也很简单,删除约束的方式共有三中方式。第一种用于删除一个单独的约束,将鼠标悬浮在某个约束的圆圈上,该圆圈会变成红色,点击即可删除。如下图:


第二种用于删除一个控件的所有约束,选中一个控件后,会在控件左下角出现一个删除约束的图标,点击该图标,就删除了控件所有的约束条件。如下图:


第三种用于删除界面所有控件的约束条件,点击即可删除所有控件的约束条件。如下图:


Properties 面板

我们知道了如何摆放控件后,下面来看下 Properties 面板的操作。当你选中一个控件后,右边的 Properties 区域就会出现很多属性选项。如下图:


在这里我们可以设置当前控件的所有属性,如文本内容,字体大小,颜色,字体样式等等。这些功能很简单,大家点一点操作也下就会了,这里就不啰嗦了。

这里重点介绍一下 Properties 区域的上半部分,这部分也称为 Inspector。


首先可以看到,在 Inspector 中有一个纵向的轴和一个横向的轴,这两个轴也是用于确定控件的位置的。我们刚才给 TextView 的上下左右各添加了一个约束,然后 TextView 就能居中显示了,其实就是因为这里纵横轴的值都是50。如果调整了纵横轴的比例,那么 TextView 的位置也会随之改变,如下图:


不过,虽然我们将纵轴横轴的值都拖动到了 100,但是 TextView 并没有紧贴到布局的右上角,这是为什么呢?实际上,Android Studio给控件的每个方向上的约束都默认添加了一个 16dp 的间距,从 Inspector 上面也可以明显地看出来这些间距的值。如果这些默认值并不是你想要的,可以直接在Inspector上进行修改,如下图:


可以看到将上边距和右边距设置为 0 之后,TextView 就紧贴在布局的右上角了。

接下来我们来看下 Inspector 最中间的那个正方形区域,它是用来控制控件大小的一共有三种模式可选,每种模式都使用了一种不同的符号表示,点击符号即可进行切换。

  • 表示 wrap_content,这个我们很熟悉了,不需要进行什么解释。

  • 表示固定值,也就是给控件指定了一个固定的长度或者宽度值。

  • 表示 any size,它有点类似于 match_parent,但和 match_parent 并不一样,是属于 ConstraintLayout 中特有的一种大小控制方式,下面我们来重点讲解一下。

在 ConstraintLayout 中是有 match_parent 的,只不过用的比较少,因为 ConstraintLayout 的出现就是为为了解决布局嵌套。既然没了布局嵌套,那么 match_parent 就没多大意义了。

而any size就是用于在 ConstraintLayou t中顶替 match_parent 的,先看一下我们怎样使用 any size 实现和 match_parent 同样的效果吧。比如说我想让 TextView 的宽度充满整个布局,操作如下图:


可以看到,我们把 TextView 的宽度指定成 any size,它就会自动充满充满这个布局,当然要记得把 TextView 的左右间距设置成 0 才可以。

那有的朋友可能会问了,这和 match_parent 有什么区别呢?其实最大的区别在于,match_parent 是用于填充满当前控件的父布局,而 any size 是用于填充满当前控件的约束规则。举个例子更好理解,如果我们有一个新的 TextView,它的其中一个约束是添加到当前这个 TextView 上的,那么 any size 的效果也会发生改变,如下图:


通过上图的演示,相信可以很好理解 any size 的作用了。

Guidelines (意译:指导线)

上面讲述了一些 ConstraintLayout 的基本操作,可当我们的布局过于复杂时,以上的操作可能会达不到我们的需求。下面我们来学习下 Guidelines,意译:指导线,我们可以把它理解为是一种"辅助线",就好比我们学几何图形时做的辅助线一样。在这里,我们可以添加 Vertical Guideline 和 Horizontal Guideline 两种辅助线。如图所示:


比如我们常见的登录界面,界面会有两个 Button,显示在中央。这时我们就需要添加 Vertical Guideline 辅助线,才能让这两个 Button 平分界面的宽度。如下图:


如上图,我们添加了一条 Vertical Guideline 辅助线,位置放在屏幕宽度的一半,这样两个 Button 就能平分屏幕的宽度了。上图就录制了添加 Vertical Guideline 辅助线的过程,gif太大的话会上传不了。

自动添加约束

自动添加约束的方式有两种:一种是 Autoconnect,另一种是 Inference。不过这两种方式我在开发中还是很少使用的,即使一个控件自动添加约束后,可能和我们想要的结果还是有很大差距的,所以我还是习惯手动给控件添加约束。这里就简单介绍一下吧,首先看下 Autoconnect,我们需要启用 Autoconnect 功能,默认情况下是未启动的。如下图所示:


打开 Autoconnect 功能后,它会根据我们拖放的状态自动判断如何为控件添加约束(很多情况下,还是需要手动补充添加约束条件),比如我们将 Button 拖放到界面的正中央,那么控件的上下左右都会自动添加上约束。如下图所示:


然后我们在 Button 下面再放一个 Button,效果如下:


可以看到,添加的 Button 只有左右自动添加了约束,此时还需要手动添加一个约束,控件才能正常显示。Autoconnect 不能完全明白我们的意图。总之,如果你感觉 Autoconnect 方便的话,可以把它当成一种辅助,但并不能完全靠它添加约束。

我们再来看下另一种自动添加约束的功能 Inference,它比 Autoconnect 的功能更加强大。因为 Autoconnect 是给当前操作的控件自动添加约束,而 Inference 是为当前界面所有的控件添加约束。因此,Inference 比较适合用来实现复杂度较高的界面。

下面通过一个例子演示 Inference 的用法。当前界面有两个 TextInputLayout,和一个 Button 按钮,我们使用 Inference 来意见生成约束。如下图所示:


好了,这里介绍了 ConstraintLayout 的一些基本用法,通过本片文章的介绍,相信你对 ConstraintLayout 有了深入的认识。还有就是 ConstraintLayout 的 Chains 功能,我目前也正在研究,下面给出关于 Chains 文章的链接:https://blog.stylingandroid.com/constraintlayout-chains-spread-chains/
目前 ConstraintLayout 版本才到 1.0.2,后续可能会出很多的功能,让我们拭目以待吧。

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

推荐阅读更多精彩内容