来源:24K纯帅

ConstraintLayout布局出来已经很久了,刚出来那会儿就想尝试一下的,结果半天都没适应,前两天看到一篇ConstraintLayout实战的文章,看完之后发现这布局贼鸡儿好用啊,日常开发中的大多数布局使用它都可以完成,而且也不需要嵌套。

ConstraintLayout又称约束布局,是谷歌在2016年开发者大会上推出的,之后在Android Studio上成为了默认布局,该布局能减少布局的层级嵌套,我们都知道,View嵌套的越多,在加载的过程中解析起来就越费时间,该布局几乎能做到LinearLayout和RelativeLayout嵌套完成的任何布局,下面跟着一波小demo来深入了解谷歌推荐的ConstraintLayout。

xxx是当前的控件,yyy是指定控件,这个指定控件也可以是容器本身(parent)

ConstraintLayout中有以下多种这样的属性:

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

参照上图给出的解释,以上属性都可以这样用,有点类似RelativeLayout中的toLeftOf,toRightOf,上面的属性中还有一个关于Baseline的,我们通过另外一张图来了解一下:

Baseline是控件中文字的基准线,这里可以理解为参照某个控件中的文字底部对齐,来看看样式:

如果不加基准线对齐的话,那么ButtonA的位置就在容器的左上角。

边距,和传统的布局是一样的用法,但是这里要注意的是,必须要设置自己的相对位置(先要指定自己在容器中的位置,可以是相对容器的,也可以是相对某个控件的),如果不设置的话,那么设置margin是无效的,大家可以试试,在一个ConstraintLayout布局中放一个按钮,除了边距之外什么都不设置,这样是没有效果的,因为你没有在布局中给它设置相对位置。

ConstraintLayout中有以下多种这样的属性:

layout_goneMarginStart

layout_goneMarginEnd

layout_goneMarginLeft

layout_goneMarginTop

layout_goneMarginRight

layout_goneMarginBottom

平常我们在开发过程中会遇到这样一个问题,当一个控件被设置成gone之后,与之关联的控件的位置常常也会发生改变,来看看样式:

平常我们写标题栏的时候应该都遇到过右边放两个按钮的情况,而且是可以控制显示隐藏的,当最右边的按钮隐藏之后,左边的按钮也要距离右边有一个边距,这种情况下我们就可以使用上面这些属性来配置布局。

水平居中

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

这个很好理解,设置与容器的左边和右边分别对齐,这样的话就能让控件水平居中了,同理垂直居中和中心对齐也是这样。可能有人会吐槽了,写这么多还不如我用LinearLayout和RelativeLayout写一句代码来的快呢?老铁还真是个急性子,接着往下看。

垂直居中

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

中心对齐

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

下面来实现一个这样的功能,让一个控件在距离左边和距离右边的比例是1:3,来看看正经写法:

相信大多数老铁都会这么写,那么我们现在来看看不正经的写法:

看到这个是不是惊呆了,一行代码就搞定了,简直不要太简洁。

官网给出的解释是,你可以以角度和距离约束窗口小部件中心相对于另一个窗口小部件中心。可能有些人看不太懂,我也没看懂(哈哈,LZ你是来搞笑的吗),但是看官网给出的图我大概明白是什么意思了,简单来说就是可以根据两个控件的中心来形成约束关系,然后可以通过设置角度来控制这个约束关系(还看不懂的话那就来实践一把)

layout_constraintCircle表示相对某一指定控件,上图中表示相对ButtonA;layout_constraintCircleRadius表示该控件的中心点到指定控件的中心点的距离(两点之间,直线最短);layout_constraintCircleAngle表示该控件的中心点在指定控件垂直方向上的角度(范围是0-360),具体看上图中标示的。

在ConstraintLayout布局中,你可以设置布局的最大和最小尺寸,而且你可通过三种方式来设置控件的大小:

特定数值,比如123dp

使用wrap_content,控件将自己计算大小

使用0dp,相当于`MATCH_CONSTRAINT`

注意:match_parent官方不建议在ConstraintLayout布局中使用,可以通过设置MATCH_CONSTRAINT(真实数值是0dp)配合约束来定义布局

下面我们来看一个例子:

ButtonA是固定宽度且靠左,给ButtonB设置了约束,刚开始预期的是设置ButtonB的宽度慢慢增大,超过ButtonA之后不管设置多大都像ButtonC和ButtonD一样,但是ButtonA却把ButtonB覆盖了,显然这不是我们需要的,这时候MATCH_CONSTRAINT的作用就能体现出来了,怎么理解这个MATCH_CONSTRAINT,我们可以理解成为了配合约束布局而代替了match_parent

在使用百分比布局时,有两种形式可以设置:

layout_constraintDimensionRatio,给宽或者高其中一个设置为0dp,然后设置该属性是一个比例,宽和高的比(相对那个已知长度的),可能说的有点绕,下面我们直接看demo:

app:layout_constraintDimensionRatio,设置宽和高都为0dp,然后设置改属性的值为H,x:y 或者 W,x:y,看一下demo

链条在同一方向上(水平或者垂直)为一组互相关联的控件作统一管理,并且链由链头(链的第一个元素)设置的属性控制,链头是水平链的最左侧的元素,是垂直链的最顶部的元素。我们来看看一些链的样式:

我们只需要设置layout_constraintHorizontal_chainStyle或者layout_constraintVertical_chainStyle的属性就好了,而这个属性有以下几种配置:

CHAIN_SPREAD模式:元素将展开(默认样式)

加权链CHAIN_SPREAD模式:如果给元素的宽或者高设置了MATCH_CONSTRAINT(0dp),它们将分割宽高方向上的可用空间

CHAIN_SPREAD_INSIDE模式:类似于SPREAD,但链的端点不会分散

`CHAIN_PACKED`模式:链条的元素将被捆绑在一起。然后,子项的水平或垂直偏差属性将影响该链元素的定位

这是ConstraintLayout布局特有的功能,你可以用它来辅助你完成布局,类似于高中数学图形学中的辅助线,只不过这条辅助线只有两个方向,水平和垂直:

当设置线的方向为horizontal时,辅助线的高度为0,宽度是容器的宽度。

当设置线的方向为`vertical`时,辅助线的宽度为0,高度时容器的高度。

我们来看看Guildline的样式(需要注意的是,辅助线是不可见的,只有在预览的时候才能通过鼠标选中可见):

Guildline有三个常用的属性,用来控制辅助线的位置:

layout_constraintGuide_begin:指定辅助线距离左边或者顶部的距离

layout_constraintGuide_end:指定辅助线距离右边或者底部的距离

`layout_constraintGuide_percent`:指定在父控件中的宽度或高度的百分比

以上demo的代码全都上传至

另外我的送书活动正在进行中:

android studio页面布局代码,还在用Android正经布局来写页面吗?相关推荐

  1. Android Studio《一行代码》3.3.4 百分比布局

    可能会遇到的问题: 1.由于使用的android studio版本比书上的高,需要另外添加依赖 在build.gradle中添加依赖 implementation 'androidx.percentl ...

  2. Android Studio使用recyclerview实现展开和折叠(在之前的微信页面基础之上)

    Android Studio使用recyclerview实现展开和缩回(在之前的微信页面基础之上) Android中RecyclerView点击item展开列表详细内容 github源码地址: And ...

  3. Android Studio中的代码格式快捷方式

    本文翻译自:Code formatting shortcut in Android Studio I have started developing with Android Studio . 我已经 ...

  4. Android Studio 上传代码到Gitee

    最近在学校里做Android的项目,一直不会通过Android Studio上传代码到Gitee,经过查阅博客和文章,现在将方法总结如下: 一.安装Git 1.下载Git 可在Git官网下载 http ...

  5. android studio统计方法数,android studio如何统计代码行数

    1.首先打开Android Studio开发工具. 2.FileSettings选项或者单击快捷菜单里的settings设置图标. 3.弹出settings对话框,搜索框输入 line 敲回车搜索. ...

  6. android如何设置自动补,Android Studio 中设置代码块自动补齐

    AS中很多提示键,并不如Eclipse中做的好,需要我们自己去自定义.这里以switch...case为例,讲解一下如何设置代码自动补全. 1.进入settings -->  Editor -- ...

  7. 【错误记录】Android Studio 的 Flutter 代码界面没有 Logcat 面板 ( 2021年08月28日最新解决方案 )

    文章目录 前言 一. 报错信息 二. 解决方案 前言 在之前的博客 [错误记录]Android Studio 的 Flutter 代码界面没有 Logcat 面板 中 , 处理了该问题 , 不过时去年 ...

  8. Android Studio快捷键之代码提示

    相信很多人在用Eclipse的时候,很习惯的都会把Content Assist设置成.abcd...z,这样每次敲代码的时候都会有自动提示,写起代码来很方便.具体设置如图: 同时,Eclipse中也有 ...

  9. android studio不能更新代码,解决Android Studio 和 Android SDK Manager 无法在线更新的问题....

    升级时提示 Connection failed. Please check your network connection and try again 修改安装目录下bin\studio.exe.vm ...

最新文章

  1. mongodb:linux基本操作
  2. shllter自动和手动实例
  3. python 反爬取数据
  4. Timer和TimerTask
  5. python 编程入门-Python编程入门电子书教程,看这几个就够了
  6. P3703-[SDOI2017]树点涂色【LCT,线段树】
  7. FusionCharts 的XML标签属性
  8. 【缓存】Redis入门
  9. django新建一个项目_如何使用Django创建项目
  10. django 1.8 官方文档翻译: 1-1-2 快速安装指南
  11. php和apache2的配置
  12. java Beanutils.copyProperties( )用法
  13. mysql关键字了解
  14. python多进程_python学习笔记:多进程
  15. 学生选课管理系统(python)
  16. 为什么我建议每个开发人员都需要学Python?
  17. Python中的if __name__ == '__main__'是什么意思呢
  18. 原来高手是这样练成的
  19. influxdb 退出命令
  20. 分析Crash report

热门文章

  1. 双层玻璃matlab,数学建模-双层玻璃窗.doc
  2. 页描述符 linux,有关Crontab导致Linux文件描述符...-探讨:crond 引发大量sendmail进...-linux下的ulimit命令用法解析(图文)_169IT.COM...
  3. 数据挖掘--分类思维导图
  4. 植保___农药基础知识
  5. json字符串、json对象、数组之间的转换
  6. C++各个算数类型占用的字节数
  7. SGU 134.Centroid( 树形dp )
  8. 读写文本文件和二进制文件——二进制模式
  9. 微软随.NET 4.5发布新REST API框架
  10. 九度OJ 1059:abc