Android控件之 ConstraintLayout

直接看属性对应的作用

1、同级约束属性(属性值为对方id)

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 我的右侧与你的右侧对齐

2、与父控件约束(属性值为“parent”)

app:layout_constraintBottom_toBottomOf="parent" 我的底部与父亲底部对齐

app:layout_constraintTop_toTopOf="parent" 我的顶部与父亲的顶部对齐

app:layout_constraintLeft_toLeftOf="parent" 我的左侧与父亲的左侧对齐

app:layout_constraintRight_toRightOf="parent" 我的右侧与父亲的右侧对齐

3、居中对齐方式

剧中对齐是由2个对齐方式共同约束达到的作用

水平居中

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"

垂直居中

app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"

完全居中

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"

4、边距

与普通的布局边距一样

android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom

5、Bias约束

上面说过的居中模式,与父控件左边对齐和父控件右边对齐达到水平居中效果,这时候就相当于一个东西被2根相同的弹簧从水平俩侧拉着达到居中,而bias就是控制这个弹簧的弹力达到居中之后再进行水平偏移。

layout_constraintHorizontal_bias 水平约束力
layout_constraintVertical_bias  垂直约束力

取值范围不知道,尝试了 0 对应最左边,1对应最右边,0.5对应居中,0~0.5之间在左侧到中心之间,0.5~1在中心与右侧之间,而小于0时无效果,大于1时,比如1.1,1.2等值时会将控件一部分拉扯出界面,超过一定的数之后控件不可见。。。这个取值具体原理有待阅读源码再讨论。

6、圆形定位(Circular positioning)

这个含义讲的是一个view从距离和角度相对于另一个view的位置

属性组
layout_constraintCircle :引用另一个小部件ID
layout_constraintCircleRadius :到其他小部件中心的距离
layout_constraintCircleAngle :小部件应该处于哪个角度(以度为单位,从0到360)

Google介绍图片

7、可见性Visibility

android:visibility="gone"

这个相对于我们以前的概念,用法是一样的,只是含义上有些不同了,以前2个view相互依赖,被依赖的那个控件设置为gone时,我们会发现,依赖的那个view就会失去所有相对属性。

而现在,如果一个控件设置成了gone,那么他并不是从屏幕中消失了,而是变为了一个不可见的点,并且他的margin,padding属性都消失了,这时候依赖他的那个view,依然会存在原有的依赖。

8、尺寸限制(Dimensions constraints )

android:minWidth 设置布局的最小宽度
android:minHeight 设置布局的最小高度
android:maxWidth 设置布局的最大宽度
android:maxHeight 设置布局的最大高度

这些属性只有在设置宽度或者高度为wrap_content时有效果。

9、宽高约束(Widgets dimension constraints)

这个讲的是我们设置控件的宽高属性

android:layout_width
android:layout_height

但是它相对于以前有个不同就是多了个 0dp,以前的除了线性布局中设置了权重的时候能设置0dp,其他地方设置0dp会报错。

含义如下:

wrap_content View计算自己的大小
match_parent View填充父布局
0dp 相当于MATCH_CONSTRAINT(后面会单独讲),简单理解为占用父控件剩余空间

10、强制约束

app:layout_constrainedWidth=”true|false”
app:layout_constrainedHeight=”true|false”
当view设置成wrap_content的情况下有效果

这个是什么意思呢?在我们2个view进行约束的情况下,如果一个view出现过长的内容,这时候我们会发现约束会被打破,看下效果:


情况1-button2未相对于父控件右侧对齐
情况1下的效果


情况2-button添加右侧与父控件对齐
情况2的效果

从上面我们看到,这个布局是有问题的,首先第一个右侧超出了父控件范围,这个跟这里讲的其实没有啥联系,只是也列出来看看,第二种情况就是我们要讲的,约束被打破了,第二个按钮本来应该是在第一个按钮的右侧的,而这时候看到,在右侧偏左,这时候我们就需要上面的属性了,我们看看设置完属性之后的效果:

设置了强制约束属性为true

11、MATCH_CONSTRAINT

使用就是将宽或高设置成0dp,默认是view占用所有可用空间,下面是一些和他配合使用的属性:

layout_constraintWidth_minlayout_constraintHeight_min:将设置此维度的最小大小
layout_constraintWidth_maxlayout_constraintHeight_max:将设置此维度的最大大小
layout_constraintWidth_percentlayout_constraintHeight_percent:将此维度的大小设置为父级的百分比(0~1之间)

这个含义其实就是设置以什么样的方式占用父控件剩余空间

12、按比例设置宽高(Ratio)

app:layout_constraintDimensionRatio="16:9" 按这个比例设置宽高比

要求宽高至少一个设置为 0dp(即MATCH_CONSTRAINT)
取值浮点值 表示宽度和高度之间的比率
取值“宽度:高度” 表示宽高比

如果宽高都设置我为0dp,也可以使用比率。在这种情况下,系统设置满足所有约束的最大尺寸并保持指定的纵横比。要根据另一个特定边的尺寸限制一个特定边,可以预先附加W,“或” H,分别约束宽度或高度。例如,如果一个尺寸受两个目标约束(例如,宽度为0dp且以父节点为中心),则可以指示应该约束哪一边,通过 在比率前添加字母W(用于约束宽度)或H(用于约束高度),用逗号分隔开:
app:layout_constraintDimensionRatio="H,16:9"

含义其实就是,在满足宽度约束之后,根据宽度和比例设置高度的结果。

13、Chains(链)

layout_constraintHorizontal_chainStyle
layout_constraintVertical_chainStyle

取值
CHAIN_SPREAD - 元素将展开(默认样式)
加权链接CHAIN_SPREAD模式,如果设置了一些小部件MATCH_CONSTRAINT,它们将分割可用空间
CHAIN_SPREAD_INSIDE - 类似,但链的端点不会分散
CHAIN_PACKED - 链条的元素将被包装在一起。然后,子项的水平或垂直偏差属性将影响打包元素的定位

14、虚拟视图

Guideline

Barrier

Group

所谓虚视图就是布局中辅助我们进行布局,但是实际上他是不会显示出来的。
什么是虚视图呢?其实我们可用看看他的源码实现:
我们看到Guideline其实是一个普通的View,然后在构造函数里将自己设置为GONE
并且setVisibility()为空方法,该View就永远为GONE了.
draw()方法为空,意思是不用去绘画.
onMeasure()中将自己长宽设置成0.
Guideline就是一个不可见的且不用测量,不用绘制,那么我们就可以忽略其绘制消耗.
其他2个虚视图也类似。

15、Optimizer优化

ConstraintLayout 的属性
app:layout_optimizationLevel="standard|dimensions|chains"

取值:
none:不优化
standard:默认,仅优化直接和障碍约束
direct:优化直接约束
barrier:优化障碍约束
chain:优化链条约束
dimensions: 优化维度测量,减少匹配约束元素的度量数量


写得不好的地方多多海涵,有错误的地方欢迎留言区交流指正!

借鉴文章://www.greatytc.com/p/ddc16a37dfa9

编程不仅是一门技术!

编程更加是一门艺术!

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

推荐阅读更多精彩内容