到Chains这个部分了。之前的新项目做得登录,注册,重置密码等暂时还没用到这种。不过后面可能随着新的设计可能会涉及到。所以赶紧过来看看先。新项目基本就打算全部用约束布局实现了。实际用了也会越来越熟悉的。
Chain
链是一种特殊的约束让多个 chain 链连接的 Views 能够平分剩余空间位置像LinearLayout的权重,不过还扩展了很多功能。所以做权重什么的还是需要这种布局。*** 有点疑问?之前的Bias呢? 之前的Bias我们看下定义***:
The default when encountering such opposite constraints is to center the widget; but you can tweak the positioning to favor one side over another using the bias attributes:
Bias是用来做间距比例使用的,为了偏向另一边更多一点。一般我们控件如果left、right都设置了都是居中的,如果你想靠左边多一些,就可以用这个比例来设置。相对margin来讲适配更好,毕竟采用的是比例。
如果要做三个控件均匀横向排列,想想前几篇的知识能不能做?相对布局,间距,中心布局,环形布局,尺寸相关约束,回过头看了看官方网站回忆了下知识,发现好像不行。貌似这种只有权重能解决这个问题了,不然没办法均分?
Chains来了,别慌....
几点要求满足链式 (看下水平情况,垂直类似分析):
1. 控件之间已经形成约束关系,parent←A← →B← →C->parent
2.Chain heads(链条头用来设置/觉得链条属性),即是A作为链条头
3.链条头、链条尾分别是A和C,了解下对后面一些属性有帮助
- 看看怎么设置链条布局样式吧,水平垂直分别是layout_constraintHorizontal_chainStyle和layout_constraintVertical_chainStyle,分别三个属性
1.水平的 Chain 链的默认模式就是spread模式,它将平分间隙让多个 Views 布局到剩余空间。
app:layout_constraintHorizontal_chainStyle="spread":
2.水平的 Chain 链的默认模式就是spread_inside模式,它将会把两边链条头、链条尾分别是A和C 到外向父组件边缘的距离去除,然后让剩余的 Views 在剩余的空间内平分间隙布局
3.水平的 Chain 链的默认模式就是packed模式**,它将所有 Views 打包到一起不分配多余的间隙(当然不包括通过 margin 设置多个 Views 之间的间隙),然后将整个组件组在可用的剩余位置居中
以上三种样式基本能满足这种均分布局样式。不过如果某个控件的宽度设置的不是wrap_content,而是一个具体的宽度dp。还比较大。这个时候布局就会有问题
解决:我们需要把控件的宽度都设置为0dp, 这样能保证控件依然均分,某个控件的内容如果超出宽度也不会影响均分效果。
当然你也可以一些控件自适应wrap_content,剩下的控件0dp,这样就能保证自适应的控件内容显示正常(不换行),但是设置为0dp的控件就会被强制各种压迫:
So...注意结合相关知识才能应对更加复杂的情况
- 看看权重吧...这跟
LinearLayout
的weight
权重设置很像,同样也能做到和上面一样的效果,也可以多分一点给第一个控件。不过也是需要设置宽度为0dp,否则大家都是wrap_content,就压迫的啥都看不到了... - app:layout_constraintHorizontal_weight="2"
最后关于margin设置:
Margins and chains (in 1.1)
When using margins on elements in a chain, the margins are additive.
For example, on a horizontal chain, if one element defines a right margin of 10dp and the next element defines a left margin of 5dp, the resulting margin between those two elements is 15dp.
An item plus its margins are considered together when calculating leftover space used by chains to position items. The leftover space does not contain the margins.
当用margin的时候是会有效的。在做均分时会先扣除间距,然后做均分。 差不多就是这样一个解释吧。哈哈哈。。。
基本上Chain布局就是差不多够用了。复杂的布局可能需要结合之前的布局知识才能完成哟....约束布局确实方便很多.....
下篇看看Virtual Helper objects(Barrier
https://zhuanlan.zhihu.com/p/37988125 就是一个灰常棒的例子),基本就短暂结束了。做项目妥妥了....