0. 前言

ConstraintLayout是Android Studio 2.2中主要的新增功能之一,我们都知道在传统的Android开发中,界面基本主要是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,而ConstraintLayout非常适合使用可视化的方式来编写界面,当然,可视化操作的背后Android Studio会自动为我们生成XML代码。本篇转载自郭大侠的博客。根据原博客做了稍微的整理和总结。

1.  ConstraintLayout布局的使用

1.1  添加依赖以及转换默认布局

为了使用ConstraintLayout,我们需要添加ConstraintLayout的依赖,首先打开当前项目的配置,如下图所示。点击Library dependency,就可以通过搜索关键字“constraint-layout”得到需要添加的库。

现在打开res/layout/activity_main.xml文件,由于这是一个新建的空项目,Android Studio会自动帮我们创建好一个布局默认的RelativeLayout,我们可以通过如下操作将它转换成ConstraintLayout。如下图所示。

转换完成之后,原RelativeLayout中的内容也会自动转换到ConstraintLayout中,比如图中的TextView。如果你不需要它的话,可以选中这个控件,然后按键盘上的Delete键即可删除。

我们可以看到,现在主操作区域内有两个类似于手机屏幕的界面,左边的是预览界面,右边的是蓝图界面。这两部分都可以用于进行布局编辑工作,区别是左边部分主要用于预览最终的界面效果,右边部分主要用于观察界面内各个控件的约束情况。

1.2  ConstraintLayout布局的基本用法

ConstraintLayout的基本用法很简单,比如我们想要向布局中添加一个按钮,那么只需要从左侧的Palette区域拖一个Button进去就可以了,如下图所示。

虽说现在Button已经添加到界面上了,但是由于我们还没有给Button添加任何的约束,因此Button并不知道自己应该出现在什么位置。现在我们在预览界面上看到的Button位置并不是它最终运行后的实际位置,如果一个控件没有添加任何约束的话,它在运行之后会自动位于界面的左上角。

那么下面我们就来给Button添加约束,每个控件的约束都分为垂直和水平两类,一共可以在四个方向上给控件添加约束,如下图所示。

上图中Button的上下左右各有一个圆圈,这圆圈就是用来添加约束的,我们可以将约束添加到ConstraintLayout,也可以将约束添加到另一个控件。比如说,想让Button位于布局的右下角,就可以这样添加约束,如下图所示。

我们给Button的右边和下边添加了约束,因此Button就会将自己定位到布局的右下角了。类似地,如果我们想要让Button居中显示,那么就需要给它的上下左右都添加约束,如下图所示。

除此之外,我们还可以使用约束让一个控件相对于另一个控件进行定位。比如说,我们希望再添加一个Button,让它位于第一个Button的正下方,并且间距64dp,那么操作如下所示。

现在添加约束的方式我们已经学完了,那么该怎样删除约束呢?其实也很简单,删除约束的方式一共有三种,第一种用于删除一个单独的约束,将鼠标悬浮在某个约束的圆圈上,然后该圆圈会变成红色,这个时候单击一下就能删除了,如下图所示。

第二种用于删除某一个控件的所有约束,选中一个控件,然后它的左下角会出现一个删除约束的图标,点击该图标就能删除当前控件的所有约束了,如下所示。

第三种是用于删除当前界面中的所有约束,点击工具栏中的删除约束图标即可,如下图所示。

1.3  ConstraintLayout布局的高阶用法

1.3.1 Inspector

当你选中任意一个控件的时候,在右侧的Properties区域就会出现很多的属性选项,如下图所示。在这里我们就可以设置当前控件的所有属性,如文本内容、颜色、点击事件等等。这些功能都非常简单,这里就不再进行详细介绍,大家自己点一点就会操作了。

需要我们重点掌握的是Properties区域的上半部分(Inspector)。首先可以看到,在Inspector中有一个纵向的轴和一个横向的轴,这两个轴也是用于确定控件的位置的。我们刚才给Button的上下左右各添加了一个约束,然后Button就能居中显示了,其实就是因为这里纵横轴的值都是50。如果调整了纵横轴的比例,那么Button的位置也会随之改变,如下图所示。

不过,虽然我们将横轴的值拖动到了100,但是Button并没有紧贴到布局的最右侧,这是为什么呢?实际上,Android Studio给控件的每个方向上的约束都默认添加了一个16dp的间距,从Inspector上面也可以明显地看出来这些间距的值。如果这些默认值并不是你想要的,可以直接在Inspector上进行修改,如下图所示:

接下来我们再来学习一下位于Inspector最中间的那个正方形区域,它是用来控制控件大小的。一共有三种模式可选。

表示wrap content。

表示固定值,也就是给控件指定了一个固定的长度或者宽度值。

表示any size,它有点类似并用于替代match parent,是属于ConstraintLayout中特有的一种大小控制方式,下面我们来重点讲解一下。

首先需要说明,在ConstraintLayout中是有match parent的,只不过用的比较少,因为ConstraintLayout的一大特点就是为了解决布局嵌套,既然没有了布局嵌套,那么在ConstraintLayout中matchparent也就没有多大意义了。

而any size就是用于在ConstraintLayout中顶替match parent的,先看一下我们怎样使用any size实现和match parent同样的效果吧。

比如说我想让Button的宽度充满整个布局,操作如下图所示。

那有的朋友可能会问了,这和match parent有什么区别呢?其实最大的区别在于,match parent是用于填充满当前控件的父布局,而anysize是用于填充满当前控件的约束规则。举个例子更好理解,如果我们有一个新的Button,它的其中一个约束是添加到当前这个Button上的,那么any size的效果也会发生改变,如下图所示。而如果是match parent的效果,那么高度会填充整个屏幕了。

1.3.2 Guidelines

刚才我们已经实现了让一个按钮居中对齐的功能,如果我们想让两个按钮共同居中对齐该怎么实现呢?

其实这个需求很常见,比如说在应用的登录界面,都会有一个登录按钮和一个注册按钮,不管它们是水平居中也好还是垂直居中也好,但肯定都是两个按钮共同居中的。想要实现这个功能,仅仅用我们刚刚学的那些知识是不够的,这需要用到ConstraintLayout中的一个新的功能,Guidelines。

我们希望让下面两个按钮在水平方向上居中显示,在垂直方向上都距离底部64dp,那么就需要先添加一个垂直方向上的Guideline,如下图所示。

Guideline默认是使用的dp尺,我们需要选中Guideline,并点击一下最上面的箭头图标将它改成百分比尺,然后将垂直方向上的Guideline调整到50%的位置,这样就将准备工作做好了。接下来实现需求如下所示。

1.3.3  自动添加约束

如果界面中的内容变得复杂起来,给每个控件一个个地添加约束也是一件很繁琐的事情。为此,ConstraintLayout中支持自动添加约束的功能,可以极大程度上简化那些繁琐的操作。自动添加约束的方式主要有两种,一种叫Autoconnect,一种叫Inference,我们先来看第一种。

想要使用Autoconnect,首先需要在工具栏中将这个功能启用,默认情况下Autoconnect是不启用的,如下图所示。

Autoconnect可以根据我们拖放控件的状态自动判断应该如何添加约束,比如我们将Button放到界面的正中央,那么它的上下左右都会自动地添加上约束,如下图所示。

然后我们在这个Button的下方再放置一个Button,效果如下。

可以看到,只需要将Button拖放到界面上,Autoconnect会判断我们的意图,并自动给控件添加约束。不过Autoconnect是无法保证百分百准确判断出我们的意图的,如果自动添加的约束并不是你想要的话,还可以在任何时候进行手动修改。总之,可以把它当成一个辅助工具。

以上是Autoconnect的用法,接下来我们看一下Inference的用法。Inference也是用于自动添加约束的,但它比Autoconnect的功能要更为强大,因为AutoConnect只能给当前操作的控件自动添加约束,而Inference会给当前界面中的所有元素自动添加约束。因而Inference比较适合用来实现复杂度比较高的界面,它可以一键自动生成所有的约束。

下面我们就通过一个例子来演示一下Inference的用法,比如界面上现在有两个TextView,两个EditText,和两个Button,如下图所示。

接下来我们先将各个控件按照界面设计的位置进行摆放,摆放完成之后点击一下工具栏上的Infer Constraints按钮,就能为所有控件自动添加约束了,如下图所示。

现在运行一下程序,最终效果如下图所示:

2.  结束语

到这里,我们基本就把ConstraintLayout中的重要用法都概括到了,ConstraintLayout有很多的功能仍然在改进当中。比如说,beta3版本中引入的Chains功能就是一个很强大的新功能,不过由于这个功能需要配合Android Studio 2.3来使用,而2.3目前也还没有出正式版,因此ConstraintLayout的更多功能就让我们拭目以待吧。

Android Studio 2.2新增布局——ConstraintLayout完全解析相关推荐

  1. android创建布局文件,android学习——Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  2. 【android studio学习】——常见布局

    标题view视图 android中所有的UI都是通过View和ViewGroup构建的,ViewGroup作为容器装界面中的控件,它可以包含View和ViewGroup,具体关系如下: 注意:andr ...

  3. android studio vfs,Android Studio:尝试呈现XML布局的InvalidVirtualFileAccessException

    我正在尝试在我的应用中预览xml布局(任何xml布局).我正在使用Android Studio 1.5 Preview 2.我一遍又一遍地收到此错误: InvalidVirtualFileAccess ...

  4. android studio 项目两个build.gradle的解析

    android 有两个build.gradle一个在外层,一个在内层(app目录内),在Android项目构件中起到关键作用. 外层的build.gradle: buildscript {reposi ...

  5. android百分比布局失效,Android Studio不能添加百分比布局的依赖,书和AS不一样,老报错,怎么弄?急~~~...

    我正好也在看这本书,这里也遇到同样的问题,不过仔细对比书上,可以看到书上的定义有: compile 'com.android.support:appcompat-v7:24.2.1' compile  ...

  6. android studio 显示view树_Android 沉浸式解析和轮子使用

    文 | 黑羽 on 移动电商 前言 我们先一起来回顾一下实现沉浸式状态栏的一般套路.在 Android 上,关于对 StatusBar(状态栏)的操作,一直都在不断改善,并且表现越来越好,在 Andr ...

  7. Android Studio 导出的apk安装时出现解析软件包错误(已解决)

    在安装apk包时我的手机以及模拟器上都没出现这个问题,小米手机.三星手机还有其他手机安装时会出现解析软件包错误,在网上找了一下大多数是因为sdk版本的原因, 所以首先检查minSdkVersion发现 ...

  8. 【Android】ConstraintLayout约束布局最全解析

    ConstraintLayout约束布局最全解析 一.ConstraintLayout概述 二.ConstraintLayout基础篇 2.1 基础操作 2.2 控件间添加约束 2.3 约束布局xml ...

  9. android 自定义窗口,Android studio如何自定义设置窗口布局?

    1.进行打开电脑中的Android studio中进行设置布局上的窗口选项. 2.默认布局设定完成之后,然后进行Android studio菜单中的"windows"的选项. 3. ...

最新文章

  1. python xml字符串和dict字典互转
  2. php接收get数组参数吗,php获取到data参数,如何与数组匹配
  3. 【java小知识】FileReader读取文件出现乱码的解决办法
  4. 122 - Trees on the level(模拟内存池解法)
  5. gogs只支持mysql5.7_在docker中跑nginx,gogs,mysql服务
  6. Android开发笔记(八)神奇的shape
  7. war包怎么解压_微信猫和老鼠主题怎么搞?快来看
  8. python关闭word_python自动化办公:玩转word之样式秘笈
  9. 正则表达式非捕获分组?:
  10. 【模拟IC】闩锁效应的概念,产生原因,工作过程及解决方案
  11. win7升级win10正式版_win7升级win10数据是否会丢失?
  12. PDF怎么加页码?PDF添加页码的方法
  13. 零代码技能平台技术实践探索
  14. Python数据分析之pandas统计分析
  15. 【一生一芯01】预学习-PA1总结
  16. 7CCSMCMP: Coursework 2 Computer Programming for Data Scientists The 7CCSMCMP instructors
  17. android 音效处理(1)
  18. 微信小程序答题赢红包 微信答题小程序抢红包,答题领微信零钱红包,答题红包小程序,可以自己出题考试的小程序
  19. 如何选择合适的前端框架,告别选择恐惧症
  20. java 读取project_java 导入读取.mpp project文件(甘特图)

热门文章

  1. Type-C分线器实现高清屏幕的理想体验
  2. Vulnhub渗透测试 DR4G0N B4LL: 1
  3. 了解Ceph 分布式存储
  4. 华人运通高端车销量难及蔚小理,处在第二梯队何时能加速上位?
  5. 如何在Docker中使用安卓模拟器+Appium
  6. 谁能成为Leader,大Leader该做什么
  7. 16QAM调制与解调-MATLAB基带仿真
  8. 自制小笔记_C#后期相关问题解决方案
  9. python正则匹配日期2019-03-11_Python正则表达式匹配日期与时间的方法
  10. Linux下OPencv+ffmpeg编译和进行视频播放