Android ConstraintLayout进阶:Chain的使用及实例

chain

Android里的ConstraintLayout是个非常强大的工具,它有效的解决了Android里Layout的层级嵌套的问题。使用一个ConstraintLayout可以实现之前多个Layout才能实现的效果。

本篇文章就介绍下ConstraintLayout里比较进阶用法之一:Chain。

Chain简介

顾名思义,Chain就是把几个控件像链条一样连接起来,实现一系列的效果。这个概念看上去有些深奥,其实并不复杂。熟悉js/css等技术的同学会发现这些概念很熟悉。就拿Android来说,使用Chain可以很大程度上在ConstraintLayout里替代原有的LinearLayout和RelativeLayout。

Chain实例

假设我们在UI上有三个控件,横着排成一排。要想应用Chain的效果,需要把这3个控件用“链子连接起来”。

Chain其实并没有定义新的控件,只是使用原来的依赖方式。代码如下:

    <Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是控件A"
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/btn_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是控件B"
        app:layout_constraintEnd_toStartOf="@+id/btn_c"
        app:layout_constraintStart_toEndOf="@+id/btn_a"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是控件C"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btn_b"
        app:layout_constraintTop_toTopOf="parent" />

对照代码,我们来看看具体的链接是如何实现的:

  1. 控件A,左端依赖父容器,右端依赖控件B。
  2. 控件B,左端依赖控件A,右端依赖控件C。
  3. 控件C,左端依赖控件B,右端依赖父容器。

通过3个控件的两两互相依赖,我们实现了把他们链接起来的目的,接下来就可以应用Chain的各种效果了。应用的方式也很简单,就是在链头(所谓链头,就是水平链中最左侧的控件以及垂直链中最顶部的控件),也就是控件A上加上一句:app:layout_constraintHorizontal_chainStyle="XXX",其中XXX就是想要的效果,可能的取值有:Spread、Spread inside、Packed几种。

    <Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是控件A"
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

接下来我们来看看各种取值具体的效果:

spread:

spread的效果

这种效果很简单,就是3个控件把整个横向空间平分。

spread_inside:

spread_inside效果

这种效果也是非常常见的,两端两个控件靠边对齐,中间的控件平分剩下的空间。

weighted:

在使用spreadspread_inside模式的时候,可以通过layout_constraintHorizontal_weightlayout_constraintVertical_weight来设置某个控件的权重值。这和LinearLayout里的layout_weight很相似。不过此时需要把控件的layout_width(水平排列)layout_height(垂直排列)设置为0dp。

比如我们修改下这个例子里的控件B:

    <Button
        android:id="@+id/btn_b"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="这是控件B"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintEnd_toStartOf="@+id/btn_c"
        app:layout_constraintStart_toEndOf="@+id/btn_a"
        app:layout_constraintTop_toTopOf="parent" />

此时的效果是这样的:


控件B的weight设置为1

此时,控件B占满了剩余的空间。

packed:

packed的效果

packed就是把控件都挤在中间显示。这时候,可以通过修改控件A的layout_marginLeft值来控制3个控件的整体位置。比如:

<Button
        android:id="@+id/btn_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是控件A"
        android:layout_marginLeft="100dp" 
        app:layout_constraintEnd_toStartOf="@+id/btn_b"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

此时3个控件整体向右移动了100dp:


整体向右偏移100dp

其他

关于Chain还有几个小知识点:

  • 一个控件既可以放在水平链里也可以放在垂直链里,因此可以轻松构建灵活的网格布局。

  • 虽然链的方向为垂直或水平,但使用其中一个方向不会沿该方向与控件对齐。因此,我们必须使用其他约束条件,以保证控件在另外的方向上对齐。比如上面的例子,我们需要app:layout_constraintTop_toTopOf="parent"来指定垂直方向的约束。


以上就是ConstraintLayout里Chain基本用法,希望对您有所帮助。

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

推荐阅读更多精彩内容

  • 我不知道矛盾是否还会爆发 我怕已成习惯 我怕自己变得冷漠 自私 无情 正因如此 我撕心裂肺般的吼叫 我有想法 我怕...
    阿拉小姐阅读 213评论 0 0
  • 沟通大师就要毕业了,回顾这一年多来的历程,颇有感触。 感动,感动,感动。。。 记得前年吧,我和他的感情早已貌合神离...
    懒懒的妈阅读 158评论 0 1
  • 俞敏洪:读书旅行 是我这棵树成长的土壤肥料 (12月5日在第七届书香中国·北京阅读季阅读盛典上的讲话) 各位亲爱的...
    大道行者_阅读 158评论 0 0
  • 健康是我们追求的第一目标 有了健康的身体我们还差啥
    一切顺心阅读 189评论 0 1
  • 对于我来说, 找人帮忙是一件很困难的事情。 一句请你帮忙,往往比说一句我爱你还难。 面对越是关系亲密的人,越是不好...
    好小孩儿玩汽球阅读 906评论 0 51