- 1.3 前言
- 1.4 入门
- 1.4.1 下载
- 1.4.2 环境配置
- 1.4.3 环境配置
- 1.4.4 环境配置
- 1.4.5 版本更新
- 1.4.6 项目和模块
- 1.5 新建
- 1.5.1 创建项目
- 1.5.2 创建模块
- 1.5.3 创建库
- 1.5.4 Library打包成aar
- 1.5.5 Studio项目
- 1.5.6 导入eclipse项目
- 1.5.7 导入Jar\/AAR
- 1.5.8 新建类和文件
- 1.5.9 增加so文件
- 1.5.10 创建Fragment文件
- 1.5.11 创建service文件
- 1.5.12 创建自定义组件
- 1.5.13 widget
- 1.5.14 创建可编译的资源文件
- 1.5.15 创建AIDL
- 1.5.16 创建Android文件夹
- 1.6 布局
- 1.6.5 ConstraintLayout约束
- 1.7.8 TODO
- 1.8 编辑
- 1.8.1 复制\/粘贴\/剪切\/撤销\/重做
- 1.8.2 查找替换
- 1.8.3 大小写替换
- 1.8.4 Macros(宏)
- 1.8.5 使用列选择模式
- 1.8.6 扩大\/缩小选择范围
- 1.8.7 合并两行内容
- 1.8.8 自动补全当前的语句
- 1.8.9 缩排
- 1.8.10 切换大小写字母
- 1.10 导航
- 1.10.1 搜索并打开某个类文件
- 1.10.2 搜索并打开某个文件
- 1.10.3 搜索并打开某个文件或方法
- 1.10.4 快速跳转到某一行
- 1.10.5 使用自定义代码块
- 1.10.6 快速跳转到光标的历史位置
- 1.10.7 快速跳转到编辑过的位置
- 1.10.8 标记书签
- 1.10.9 管理书签
- 1.10.10 快速跳转到导航栏
- 1.10.11 快速跳转到声明
- 1.10.12 快速跳转到类型声明
- 1.10.13 快速跳转到实现
- 1.10.14 快速跳转到父类
- 1.10.15 在快速类和被测试类之间快速跳转
- 1.10.16 查看相关联的文件
- 1.10.17 查看文件结构
- 1.10.18 查看类的层次结构图
- 1.10.19 查看方法类型的层次结构图
- 1.10.20 查看方法调用层次结构
- 1.10.21 快速跳转到错误代码位置
- 1.10.22 方法间前后跳转
- 1.10.23 使用翻页
- 1.10.24 选择当前文件在哪里显示
- 1.10.25 光标快速跳转到编辑器
- 1.11 编码
- 1.11.1 覆写或者实现方法
- 1.11.2 实现接口方法
- 1.11.4 生成构造函数
- 1.11.5 生成Getter和Setter方法
- 1.11.6 覆写equals和hashcode方法
- 1.11.7 快速覆写toString方法
- 1.11.8 插入版权信息
- 1.11.9 提取或删除语句
- 1.11.10 自动补全提示
- 1.11.11 代码补全
- 1.11.12 循环扩展词
- 1.11.13 展开或折叠代码
- 1.11.14 代码模板
- 1.11.15 注释
- 1.11.16 格式化代码
- 1.13 重构
- 1.13.1 重命名
- 1.13.2 提炼方法
- 1.13.3 提炼方法对象
- 1.13.4 更改方法签名
- 1.13.5 迁移变量类型
- 1.13.6 转成静态方法
- 1.13.7 静态方法转为实例方法
- 1.13.8 移动类
- 1.13.9 移动静态方法
- 1.13.10 移动静态字段
- 1.13.11 安全删除
- 1.13.12 提炼为变量
- 1.13.13 提炼为常量
- 1.13.14 提炼字段
- 1.13.15 提炼参数
- 1.13.16 提炼委托
- 1.13.17 提炼接口
- 1.13.18 提炼父类
- 1.13.19 内联方法
- 1.13.20 内联临时变量
- 1.13.21 查找并替换重复代码
- 1.13.22 反转布尔值
- 1.13.23 把成员拉到父类
- 1.13.24 把成员推到子类
- 1.13.25 尽可能使用接口
- 1.13.26 使用委托替换继承
- 1.13.27 移除中间人
- 1.13.28 包装方法返回值
- 1.13.29 将匿名类转成内部类
- 1.13.30 封装字段
- 1.13.31 使用查询替换临时变量
- 1.13.32 使用工厂方法替换构造方法
- 1.13.34 泛型化
- 1.13.35 迁移
- 1.14 打包构建(Gradle)
- 1.14.1 认识Gradle
- 1.14.2 Gradle中依赖的仓库
- 1.14.3 配置Gradle环境
- 1.14.4 Wrapper
- 1.14.5 初始化构建环境
- 1.14.6 解决Gradle下载太慢的问题
- 1.14.7 查看和执行Gradle任务
- 1.14.8 常用Gradle任务
- 1.14.9 Gradle工具窗口
- 1.14.10 构建项目和模块
- 1.14.11 设置自动编译项目
- 1.14.12 重新构建项目
- 1.14.13 Project的区别
- 1.14.14 清理项目
- 1.14.15 Script
- 1.14.16 Gradlew配置文件:gradle-wrapper.properties
- 1.14.17 项目全局配置文件:settings.gradle
- 1.14.18 本地属性配置文件:local.properties
- 1.14.19 Gradle配置文件:gradle.properties
- 1.14.20 代码混淆规则配置文件:proguard-rules.pro
- 1.14.21 项目构建配置文件build.gradle
- 1.14.22 模块构建配置文件:build.gradle
- 1.14.23 项目结构中配置模块构建
- 1.14.24 配置应用程序属性
- 1.14.25 配置应用程序签名
- 1.14.26 配置应用程序的特性
- 1.14.27 配置应用程序的构建类型
- 1.14.28 配置应用程序的依赖
- 1.14.29 打签名包
- 1.14.30 多渠道打包
- 1.14.31 配置开发者服务
- 1.15 运行调试
- 1.15.1 运行和调试配置
- 1.15.2 Android应用程序配置
- 1.15.3 断点
- 1.15.4 调试工具
- 1.15.5 计算表达式
- 1.15.6 关联调试到Android进程
- 1.15.7 配置和运行单元测试
- 1.15.8 使用命令行运行单元测试
- 1.15.9 配置Android单元测试
- 1.17 版本控制
- 1.17.1 Git偏好设置
- 1.17.2 配置Github
- 1.17.3 从Github克隆代码
- 1.17.4 将本地项目共享到GitHub
- 1.17.5 查看本地变更历史
- 1.17.6 Git添加文件
- 1.17.7 Git提交变更
- 1.17.8 Git文件逐行追溯
- 1.17.9 显示当前修订版本
- 1.17.10 Git文件比较
- 1.17.11 Git撤销操作
- 1.17.12 Git版本回退
- 1.17.13 Git查看提交历史
- 1.17.14 Git分支管理
- 1.17.15 Git创建标签
- 1.19 插件
- 1.19.1 插件下载安装
- 1.19.2 常用插件
- 1.19.3 插件开发
- 1.21 快捷键
1.6.5 ConstraintLayout约束
1.ConstraintLayout基本界面
更新Android Studio 2.2之后,更新了布局设计器,同时,引人了ConstraintLayout,这一布局,旨在降低布局层级,其主要界面如下所示:
这个界面主要分成下面几个部分:
左侧边栏,包括Palette组件库和Component Tree
中间是布局设计器,包括两部分,左边是视图预览,右边是布局约束
右侧边栏,上面是类似盒子模型的边界和大小布局设计器,下面是属性列表
在熟悉了界面之后,我们要做的就是理解,什么是ConstraintLayout。ConstraintLayout的核心,实际上就是『约束』,这个翻译很直接,也很准确,它可以说是一个强化的 RelativeLayout,只不过比RelativeLayout增加了更多的约束条件和方式,从这一点上去理解,就很容易接受了。
在第一次引人ConstraintLayout的时候,Android Studio会自动去下载依赖,等他自动完成安装即可。 最后,在build.gradle中会添加一行依赖:
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'
Google提供了一个CodeLab来帮助开发者熟悉这个布局,地址如下所示:
https:\/\/codelabs.developers.google.com\/codelabs\/constraint-layout\/index.html#0
同时,2016IO上Google也给出了一个Topic来讲解,地址如下所示:
https:\/\/youtu.be\/sO9aX87hq9c
2.ConstraintLayout约束类型
简单的说,约束,就是组件与组件之间的关系,借用官网上的一张图,我们来解释下:
这里展示的,就是左右两个Button直接的关系,这实际上就是一个简单的相对布局方式,下面我们来看一下具体的约束类型。
当我们点击一个控件的时候,它的显示效果如图所示:
这里主要包含几种类型的约束
尺寸约束
边界约束
基准线约束
我们一一来看。
尺寸约束
尺寸约束使用的是『实心方块』,如图:
这个很好理解,就是调整组件的大小。
边界约束
边界约束使用的是『空心圆圈』,如图:
边界约束,是使用最多的约束,它用于建立组件与组件之间、组件与Parent边界之间的约束关系,实际上,就是确定彼此的相对位置。
基准线约束
基准线约束,使用的是『空心圆角矩形』,如图:
基准线约束,是让两个带有文本属性的组件进行对齐的,可以让两个组件的文本按照基准线进行对齐。唯一要注意的是,你需要把鼠标放在控件上,等基准线约束的图形亮了,才可以进行拖动。
清除约束
通过工具栏上的『清除约束』按钮,或者是控件上的悬浮提示,都可以清除一个控件的所有约束条件,如图:
掌握好这几种约束条件的使用后,就可以自己去尝试下了,我们只要拖一个控件,来体验下。
3.约束示例
这里我把官网上的几个Demo的动图Copy过来:
4.自动约束Autoconnect
在布局设计器的菜单栏上,有一个『磁铁』一样的图标,如图:
默认这个按钮就是打开的,通过这个,我们可以实现组件约束的自动创建,Demo示例如图:
这个和PPT里面拖动布局的时候,会弹出对齐的基准线,然后帮你自动居中这些功能类似。实际测试下来,这个功能可以很方便的在拖动组件的时候,帮你写好约束,但有些精确的调整,还是需要手动去创建的。
5.约束推断Inference
在布局设计器的菜单上,还有一个『灯泡』一样的按钮,通过这个按钮,可以帮我们自动创建组件间的约束关系,他分析的是一个组件附近的组件,并根据当前在设计面板中的位置来创建约束关系,如图所示:
约束推断这个功能非常强大,我们只需要把组件拖到一个地方,然后就可以通过推断,来完成最基本的约束创建,最后,手动进行完善即可。
6.View Inspector
Inspector界面就是设计布局的右边栏,包含了一个类似盒子模型的布局检查器和对应属性的属性列表,如图所示:
属性这一块我们就不看了,和大家在XML中写的属性是一样的,只不过这里通过可视化的方式弄出来了,这个之前就有了,我们主要来看下上面的那个界面。
这上面的ID,不多说了,这个盒子四周的线,代表着我们的Margin设置,在工具栏上,还可以设置Margin的基数,对于MD设计风格,这个基数一般是8dp,所以,这里可以选择X8的Margin:
另外,最外面边框上还有两个带数字的小圆圈,这个就是控制相对位置的比例的,如图:
通过这个比例的设置,我们天然就自带了百分比布局。
最后,最难理解的就是盒子里面的那四根线,如图:
这里的四根线,在点击后,会发生变化,总共有以下几种:
Fixed
这样一个类型的线,可以让你写定具体的大小数值。
Wrap Content
这个就是Wrap Content的含义,包裹内容,没有发生变化。
AnySize
这个就是最难理解的,它表示组件会占用所有的可用空间来适应约束,类似线性布局中,设置width=0,weight=1的方式。
7.Align
在工具栏中,可以使用对齐工具,快速给选定组件设置对齐约束,如图:
我们可以来演示下:
8.Pack
在工具栏中,可以使用Pack工具,快速对组件进行编组操作,如图:
9.快捷布局
在一个组件上点击右键,可以快速创建一些布局的快捷设计,如图所示:
在这里,可以快速设置组件的居中,对齐等方式。
10.GuideLine
为了更加灵活的布局,ConstraintLayout还提供了一个GuideLine,如图所示:
你可以为布局添加水平和竖直引导线,针对这条线来作为基准线布局,如图所示:
11.ConstraintLayout布局转换
通过Android Studio,我们可以很方便的把一个普通布局转化为ConstraintLayout,在布局设计器的左边栏下面的Component Tree来进行转换,如图所示:
转换还是很赞的,但目前还没试过复杂的布局是否有问题。
12.从代码角度理解ConstraintLayout属性
ConstraintLayout被称为增强的RelativeLayout,是有它的原因的,相对布局提供了layout_toBottomOf类似这样的属性来控制组件间的相对位置,那么ConstraintLayout实际上也是一样的,我们来看这样一个属性:
app:layout_constraintTop_toBottomOf
他代表的是『期望组件的顶部,与指定组件的底部对齐』,那么了解了这个解释方式,其它的属性就很好理解了,所以说,虽然ConstraintLayout不太建议通过代码来布局了,但能理解代码的含义,对理解ConstraintLayout布局是非常有帮助的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论