ConstraintLayout

基础知识

1. Relative positioning相对定位

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

总结:layout_constraintA_toB 参数为目标id或者parent

A当前控件,B目标控件,A控件的哪一侧(上下左右)与B控件的哪一侧(上下左右)对齐

例如layout_constraintLeft_toLeftOf 控件A的左侧和控件B的左侧对齐
例如layout_constraintTop_toBottomOf 控件A的顶部和控件B的底部侧对齐

注意,如果当前控件的layout_height或者layout_width值为match_parent,约束会失效,改为0dp即可

2. Margins

【1】基础信息

android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom
注意,值必须为正数或者0,使用Dimension

【2】当被依赖控件隐藏View.GONE时,下面的几个属性生效

layout_goneMarginStart
layout_goneMarginEnd
layout_goneMarginLeft
layout_goneMarginTop
layout_goneMarginRight
layout_goneMarginBottom

当约束目标控件可见性设为View.GONE时,启用该属性,代码示例如下

正常显示,图1
<androidx.constraintlayout.widget.ConstraintLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/mainBkg">
​
   <TextView
   android:id="@+id/view"
   android:layout_width="200dp"
   android:layout_height="200dp"
   android:layout_marginStart="50dp"
   android:layout_marginTop="100dp"
   android:background="#fff"
   android:gravity="center"
   android:text="目标控件"
   android:visibility="visible"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" />
​
   <TextView
   android:layout_width="50dp"
   android:layout_height="50dp"
   android:layout_marginStart="20dp"
   android:layout_marginTop="20dp"
   android:background="#123"
   android:gravity="center"
   android:text="当前控件"
   android:textColor="#fff"
   app:layout_constraintStart_toEndOf="@id/view"
   app:layout_constraintTop_toTopOf="@id/view"
   app:layout_goneMarginStart="100dp"
   app:layout_goneMarginTop="200dp" />
  ​
 </androidx.constraintlayout.widget.ConstraintLayout>
图1
隐藏目标控件后android:visibility="gone"
图2

3. Centering positioning中心定位和偏差

当控件左侧与父控件左侧对齐,右侧与父控件右侧对齐时app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent",除非控件大小和父控件大小一致,否侧会在约束方向上(此时为横向)居中显示,同理纵向也是一样

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:text="居中"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
居中

偏移量

当控件在父控件中居中显示或某方向居中显示时,使用bias属性调整控件偏移位置
layout_constraintHorizontal_bias layout_constraintVertical_bias,方向为从上到下,从左到右,如果layout_constraintHorizontal_bias设为1,位于父控件最右侧,layout_constraintVertical_bias设为1,位于控件最底部
取值范围float,0-1,如果大于1会显示不全,默认0.5
如图,目标控件原本居中显示,设置偏移量后位置改变

偏移

4. Circular positioning圆形定位

您可以以一定角度和距离将一个小部件中心相对于另一个小部件中心进行约束。
layout_constraintCircle 定位控件ID
layout_constraintCircleRadius两个控件中心点之间的距离
layout_constraintCircleAngle角度,取值范围0-360的整数

官方截图

5. Visibility behavior可见性处理

与其他layout的区别在于
  • 当控件设为GONE时,被认为尺寸为0,可以理解为布局上一个点
  • GONE的控件对其他控件有约束,约束保留并生效,当margin会清零

6. Dimension constraints尺寸约束

6.1 为ContraintLayout这只最大最小宽高

ContraintLayout宽高设为WRAP_CONTENT时可以设置最大最小宽高

  • android:minWidthandroid:minHeight最小宽高
  • android:maxWidthandroid:maxHeight最大宽高
6.2 设置控件宽高

设置android:layout_width,android:layout_height
参数:

  • 明确设置大小,如1dp
  • 设为WRAP_CONTENT,控件自己计算大小
  • 设为0dp,根据约束条件显示大小
    注意:不建议在ConstarintLayout中使用MATCH_PARENT,建议设为0dp,约束条件中控件使用parnet
6.3 强制约束

当控件设为WRAP_CONTENT时,添加约束尺寸是不生效的,想要生效,需要添加如下属性

  • app:layout_constrainedWidth=”true|false”
  • app:layout_constrainedHeight=”true|false”
6.4 MATCH_CONSTRAINT
  • 改变最大最小,可以设固定dp数字,也可设为wrap(相当于WRAP_CONTENT)
    layout_constraintWidth_minlayout_constraintHeight_minlayout_constraintWidth_maxlayout_constraintHeight_max
  • 设置百分比模式
    1. 尺寸大小设为0dp
    2. 设置百分比模式app:layout_constraintWidth_default="percent"app:layout_constraintHeight_default="percent"
    3. 设置所占大小(0-1)layout_constraintWidth_percentlayout_constraintHeight_percent
  • 控件宽高按照比例计算大小
    1. 控件宽高至少一个为0dp
    2. 设置属性app:layout_constraintDimensionRatio
      属性取值可以是宽度比高度的比例(float),也可以是固定格式 "width:height",也可以是前缀W或H,指定一边相对于另一边的尺寸,如”H, 16:9”,高比宽为16:9

7. Chains 链条

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

推荐阅读更多精彩内容