动态图解&实例 ConstraintLayout Chain

概述

昨儿写了一篇全文字和JPG、无Gif的博文ConstraintLayout 属性详解 和Chain的使用

主要详解了ConstraintLayout的所有属性,

但是有朋友问Chain是如何通过可视化的方式去添加,

于是便有了此文。

但是只讲解Chain又显得太单薄,

于是我又加入了一个用ConstraintLayout实现商品详情、Item布局的实例。

废话少说,开整:

构建链条 Chain 图文步骤

假设我们要需要构建 竖直的链条。

第一步,先拖三个Button竖直排列。

可以看到在“Design”区域,除了位置,我们还可以调整控件的大小。

第二步,选中三个Button。

可以用鼠标划一个范围选中这N个控件。

也可以用键盘Ctrl + A 全选控件。

第三步,右键->Center Vertically.

链条已经构成了。

第四步,在Design区域上方的工具栏ALign选项中,可以切换水皮方向控件的排列规则

依次左对齐-居中-右对齐

当链条已经构成时,可以从图中看到,每个控件的下方多了一个链条样式的小图标。

第五步,单击链条图标,可以切换ChainStyle。

由上图可以看出,会在三种模式依次循环切换:spread-spread_inside-packed

图示在上文ConstraintLayout 属性详解 和Chain的使用也已经给出:

实战

talking is cheap。让我们一起实战一波,先看一个设计稿:

这是一个常见的详情或Item的布局。

以往情况,如果不使用ConstraintLayout,我们一般会通过嵌套LinearLayout或者使用RelativeLayout去实现它。

嵌套LinearLayout肯定是低效的low方式,我们不提。

而如果有经验的老司机应该会知道,RelativeLayout实现起这种布局是很烦心的,

因为它大体是按照竖直排列,在局部又水平分布了几个控件,我们要死去活来的写N多的below rightOf

(而且如果RelativeLayout如果要实现几个TextSize不一样 TextView 居中对齐是挺麻烦的。 虽然这个设计稿上没有出现这种case。而现在可以通过ChainAlign轻松实现它。)

DuangDuangDuangDuang,现在ConstraintLayout横空出世,让我们用拖拖拽拽点点的方式来轻松实现它吧。

第一步,去xml修改父布局宽高为WRAP_CONTENT

第二步,拖拽一个ImageView,并按设计稿设置尺寸,布局在父控件顶端

我们只是为了测试,可以设置图片为fitxy,便于观察效果。

第三步,拖拽四个TextView,竖直排列。顺便按照设计稿填充颜色、尺寸等元素

(这两个步骤我撸了四五次,都撸不出完整的gif,大家凑合看,这两张图已经展示了,可以通过Design区域去设置text、textColor、textSize等等等属性)

第四步,设置四个TextView之间的约束、间距等

(我尽力了,电脑上撸这么大的GIF图貌似时长有问题,所以我重复了N次这个过程,分别撸了几张图如下:)

操作步骤就是:利用控件四个边中点的圆圈,和其他控件发生约束。可以利用右侧面板修改控件的属性值。

第五步,拖拽两个TextView放在底部,按照设计稿填充颜色、尺寸等

图略,和第三步相似。(其实是图又录坏了)

第六步,按照设计稿约束底部三个TextView,设置边距等

对于精细尺寸,例如这里三个TextView间距大概5dp,可以通过Inspector区域设置:

第七步, 布局 购物车 加减按钮

购物车按钮使用的是一个自定义View

所以这一小节也顺便讲解如何在ConstraintLayout中拖拽使用自定义View。

关于这个购物车控件,我之前写过相关博文,github地址:https://github.com/mcxtzhang/AnimShopButton

在左上角Pallete区域点击Advanced->view,然后拖动至布局区域后,会弹出弹框让我们选择,我们搜索AnimShopButton(自定义View的名称)即可。

第八步,为 购物车控件 添加约束

查看设计稿,该控件是位于父控件右下角,距离右边和底边有14dp的间距:

第九步,使底部三个TextView竖直居中

这一步是我强加的戏,为了展示Chain的作用。

我把底部的几个控件链接成Chain,并且改变了使它们竖直方向也相对居中。

这时界面突然收缩了,显然是约束哪里出了问题。

于是我们切换到Text页面,查看代码具体哪里出了问题,

定位到价格TextView后,

检查约束,

如果是我们自己手写约束,

app:layout_constraintVertical_bias="1.0"应该不会被写下来,

这一条约束应该是和父控件的WRAP_CONTENT一起,导致布局收缩了。

删掉该条约束,界面预览正常。

第十步,在根布局外面套一层CardView,运行

运行后效果:

总结

可以看出,ConstraintLayoutChain的概念,和前端JS中flex布局是一样的。

如果有ReactNative或者前端经验的童鞋应该一眼可以看出。或者更适应这种布局方式。

使用ConstraintLayout去完成布局,经历短暂的不习惯后,上手后速度还是挺快的,

相比较RelativeLayout它有 可拖拽、可视化的优势,以及轻松完成一些RelativeLayout不太方便完成的布局。

还是推荐大家去使用它的。

原文地址:https://www.cnblogs.com/youseiraws/p/8611499.html

时间: 2024-10-13 15:25:02

动态图解&实例 ConstraintLayout Chain的相关文章

动态代理-实例解析

转自http://weixiaolu.iteye.com/blog/1477774 动态代理实例如下所示: package cn.xiaolu; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能.

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例

一.概述 基于Spring动态配置多数据源,在大型的应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效的提高系统的水平伸缩性,而这样的解决方案就会补同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求以及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. Spring配置多个数据源的方式和具体使用过程,Spring对于多数据源,以数据库表为参照,大体上可以分为两大类情况: 1.表级上的跨数据库,即对于不同的数据库却有不相同的表(表名和表结构完全

利用反射动态创建实例并调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期绑定,访问在运行时创建的类型的方法. 首先,新建一个空白解决方案:DllSolution 向解决方案中添加一个类库:RefDll,这将是需要被动态创建的程序集 重命名默认新建的Class1类:Student,这个类将是需要动态创建的类.

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

动态数组排序实例

要实现动态数组排序,需要将数据采用链表的形式存储.举例如下: package com.cn.datastruct; import java.io.IOException; import java.util.Scanner; //动态数组排序实例 public class DynamicArray { //链表结构 static class LinkList{ char data; //数据域 LinkList next; //指针域 } //创建链表 static LinkList CreatL

动态材质实例(Dynamic Material Instance)

转自:http://blog.csdn.net/panda1234lee/article/details/62041775 本例将通过 “靠近影响椅子的颜色” 来展示什么是 动态材质实例(Dynamic Material Instance) 首先,我们搜索椅子模型——SM_Chair,双击打开它的材质——M_Chair 可以看到 ColorSeats 参数影响着椅子的颜色,记住它的名字. 接着,我们创建一个继承自 Actor 的蓝图类,将椅子的模型拖入新建的蓝图类 然后,我们为其顶一个触发区域,

python 动态给实例添加属性和方法并使用__slots__

from types import MethodType #创建一个空类class Person(object): __slots__ = ("name", "age", "speak") per = Person()#动态添加属性,这体现了动态语言的特点(灵活)per.name = "tom"print(per.name)#动态添加方法'''def say(self): print("my name is &quo

Spring AOP之 动态代理实例

1.项目结构图如下3.3.3.1: 图3.3.3.1 2.IUserServ接口代码与UserServImpl实现类代码和上述代码相同 3.LogHandler类代码 public class LogHandler implements InvocationHandler { //目标对象 private Object targetObject; /** * 创建动态代理类 * @return object(代理类) */ public Object createProxy(Object tar

swt动态图表实例

前段时间做了个linux信息采集系统,目的是在windows环境下监测linx主机的资源使用情况以及硬件的健康状况,采集到信息后需要以动态图表的形式显示出来,由于使用的swt的来做的界面,上网收缩后发现相关的资料很少,要么不能用,要么不适合,于是决定写个demo,方便以后使用,希望对有需要的人有所帮助.本demo使用的是jfreechart组件,这个demo是根据官网的demo改的,为了方便使用LinkedHashMap来维护数据,因为这是有序的,而且可以通过重写removeEldestEntr