实战-ConstraintLayout新布局

在今年,2016年的Google i/o 大会上,Google推出了Android studio2.2,其中包含了为Android界面布局推出的最新的约束型布局ConstraintLayout,接触过iOS界面开发的朋友,可以认为这是Google为Android推出的AutoLayout布局。因为这方面的资料还不是很多,大部分的资料都是Google官方介绍翻译,没有具体用在项目里的实例,在此正好公司项目中遇到一个问题,用ConstraintLayout解决了,期间也遇到点困难。在这里我写出来,希望可以帮助到大家,也为了推广这种布局,希望大家可以使用。

如图,需求是一个时间轴控件,使用ListView实现。

每个adapter中包含:

  1. 一个ImageView,表示时间轴中的进度点
  2. 进度点,上面的线line_top(View)
  3. 进度点,下面的线line_bottom(View)
  4. 两个TextView,分别是进度说明,和时间
  5. 一条横向的线line(View)
最终做出来的效果图如下
最终效果图

现在我们分析一下这个效果图:

  • 进度点有两种形态,大小不一;
  • 两个进度点之间的连线颜色可以改变;
  • 进度点,上下的两条线,3个控件需要中心对齐;
  • 进度点需要跟第一个的TextView第一行水平对齐,说明上半部分线高度可以固定;
  • 第一个TextView行数不确定,说明下半部分线长度不确定;
  • 横向的虚线左端与两个TextView保持在同一Y轴上,同时右端顶到屏幕最右边。

上面这6点是布局中需要注意的,不变的部分很容易,我们只需要关注变的部分,再精减一下:

  1. 进度点下面的线高度,可变;
  • 第一个TextView行数,可变;
  • 横向的灰色线长度要随着设备宽度变化;

再剖析一下,上面3点中,2,3两点很容易在RelativeLayout中实现,但是1的高度,是根据TextView的行高来实现的,既1的变化,依据2的变化。

可惜的是,我在用RelativeLayout,实现这3点的时候,发现下部的线高度不能自动保持跟第一个TextView,一样的高度,只能保持一行的高度,个人认为是TextView调用setText()方法时,通知了TextView的重新绘制,但是下部分的线没有重新绘制,这也许是RelativeLayout的不足之处。个人愚见,还有待探究。

因为我想用xml就把布局关系完成,不需要再代码里面在操作布局关系,通知绘制,所以就想到了新布局,ConstraintLayout约束布局。
下面开始:

第一步:创建布局,摆放控件

转换成为ContraintLayout


转换成为ContraintLayout

把需要的控件都放进去,如下图,大概摆好


大致位置

现在我们看到的大概的位置,没有添加任何约束。

第二部:添加约束

对于约束,每一个控件至少水平方向,垂直方向各有一个约束,才能使视图不会报错,想让自己的布局完美展现在手机上,我们应该消除所有警报。

Paste_Image.png

首先我们知道line_top位置和长度都是固定的,这里我让它距离屏幕左边30dp,高度设置为12dp。鼠标放在line_top上,会出现4个空心圈。这4个空心圈代表着line_top,上下左右都没有设置约束,我们想让line_top距离左边30dp,鼠标点击左边的空心圈,按住不松,拖至屏幕左边沿,会出现如下图,松开就设置了一个约束,

line_top左边到屏幕左边沿约束

这时我们观察,界面左边栏。如下图:

按照上面的操作,再把line_top上方设置一个约束,距离顶部0dp。这样line_top这条线就被固定住了。

现在我们之后所有的控件都直接依赖或者间接依赖这个line_top控件,进行布局。

下面我们将进度点ImageView这个控件,与line_top中心对其,如下图:

ImageView中心对其line_top

ImageView左右两边都设置约束,分别对line_top左右两边对齐,这时进度点ImageView自动中心对齐了line_top。很简单,但是我一开始就想不到,也是试了半天才知道要这么设置。
这时,我们要开始布局下一个控件了么?不,我们应该检查刚刚的Imageview有没有满足下面这条准则:
对于约束,每一个控件至少水平方向,垂直方向各有一个约束,才能使视图不会报错,想让自己的布局完美展现在手机上,我们应该消除所有警报。

显然这个进度点在垂直放向缺少一个约束,我们让他上方距离line_top有3dp的距离

ok,此时我们设置下一个控件,第一个TextView,TextView上方与进度点ImageView上方水平对齐,�我们拉住TextView上方的空心圈,移到ImageView的上方,送手,就完成了水平对齐
再设置左边到ImageView右边距离为16dp。完成如下图:

第一个TextView约束

接下来我们让第二个TextView完成它的约束,我就不细讲了,相信你们也明白怎么用了,如下图:

第二个TextView约束

下面是重点了,line_bottom的约束我们怎么设置:

line_bottom未完成的约束

这里我们看到有两个约束,一个是左边与line_top左边对齐,这样因为line_top已经与ImageView中心对齐,所以line_bottom这样也会跟ImageView中心对齐,但是我们知道line_bottom长度不固定,是可变的。选中line_bottom,接下来,我们看下图:

line_bottom的高度设置

如下3种模式:

Fixed: 此选项允许你指定控件的高和宽.
AnySize: 此选项让控件占用所有可用空间以适应约束. 换句话说, 这更像是匹配约束. 与 match_parent 不同, 后者占用父 View 的所有可用空间.
Wrap Content: 此选项仅扩展至所含元素(如 text 或者 drawable)填充满 widget.

显然我们要把它切换为AnySize。

再让line_bottom下方与横向line距离为0dp,完成约束,如下图:

line_bottom完整的约束

最后我们只剩下一个横线line,没有设置约束了,一样他也是可变的,设置为AnySize,添加约束。如图:

横向line的约束

完成了么?
看起来好像没有问题了。不过我们是不是忘了第一个TextView内容很多,可能会出现几行的情况。
这里我们还需要给第一个TextView的右边设置一个到屏幕右边沿的约束,我们设置为距离右边50dp,同时TextView的宽也要设置为AnySize,因为他是可变的。
最后所有约束设置完成,我们看一下完整版的图:

完整约束图

我们可以试验一下是否可以自动适应高度。我们向第一个TextView中写入一段话,将控件撑大点,效果如下图:

效果图

可以看到效果很不错。到此为止,解决问题,同时ConstraintLayout可以完成很复杂的布局,减少布局的层次,Android布局层次越深,带来的性能损耗越大,当然对于目前Android手机性能不是问题,但是作为一个进益求精的开发者,谁不希望用最少的资源,完成最酷的效果呢?

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

推荐阅读更多精彩内容