Android ConstraintLayout详解

https://www.jianshu.com/p/a8b49ff64cd3

1. 概述

 
 

在本篇文章中,你会学习到有关ConstraintLayout -- 一种构建于弹性Constraints(约束)系统的新型Android Layout。最终你将会在Android Studio中编辑与构建一个相对复杂的Layout。

收获
  • 新Layout Manager所使用的Constraints系统
  • 创建Constraints来构建弹性高效的Layouts
  • 新Layout编辑器的各种功能
需求

2. 获取示例代码

$ git clone https://github.com/googlecodelabs/constraint-layout.git

3. 运行示例代码

  1. 打开Android Studio,选择 File>New>Import Project,选择步骤2下载的示例代码的文件夹constraint-layout-start
  2. 点击Gradle sync按钮。
  3. Project�面板内打开 res/layout/activity_main_done.xml
  4. 选择Design选项显示最终的layout编辑界面
  5. 在编辑器左上角选择Virtual Device to render the layout withNexus 5x
  6. 完工

4. Constraints 系统概览

Layout引擎使用Contraints指定每个widget来决定他们在layout中的位置。你可以使用Android Studio Layout编辑器界面来手动或者自动指定约束。要更好的理解他,需要我们了解一下他对一个选中的widget的基本控键。

Constraints

Constraints帮助你保持widgets对齐。你可以使用箭头来决定各widgets的对齐规则。例如(�图示 A),从button 2左侧控键设置一个constraint到button 1的右侧控键意味着:button 2会放置于button 1右侧56dp

 
图示 A
控键类型
 
图示 B:不同类型的控键
  • 调整尺寸控键 - 类似于其他设计/绘图应用,该控键允许你调整widget尺寸

     
     
  • 侧约束控键 - 该控键让你指定widget的位置。例如,你可以使用widget的左侧控键到其他widget的右侧控键相隔24dp

     
     
  • 基线约束控键 - 该控键帮助你对齐任意两个widget的文字部分,与widget的大小无关。例如你有两个不同尺寸的widget但是你想要他们的文字部分对齐。

     
     

《ConstraintLayout从入门到放弃》

太长;别读

5. ConstraintLayout应用

一)开启

现在,让我们开始来构建你自己的Constraint Layout。

从左侧导航栏打开 res/layout/activity_main_start.xml

  • 载入constraint-layout依赖
    constraint-layout依赖构建在一个分离的支持库里,该依赖支持从Android2.3(Gingerbread)到最新的版本。这个项目在app/build.gradle里已经包含了该依赖
dependencies {
...
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha2'
}
  • **回到 res/layout/activity_main_start.xml **

    该layout已经有了一个空的ConstraintLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"> </android.support.constraint.ConstraintLayout>

在编辑器底部转换到Design选项

 
 
  • 添加ImageView
    添加一个ImageView到layout。在编辑器内,找到ImageView拖到layout内。
 
 

ImageView一旦拖到layout中,UI会提示需要resource。constraint-layout-start已经包含了resources,请选择@drawable/singaporeresource。
一旦选中ImageView,你可以点击并按住调整尺寸控键来调整图片大小。

 
 
  • 添加TextView
    找到TextView并拖到layout内。

     
     

    我们会看到一些警告,因为在ImageView以及TextView内没有contentDescription属性。内容描述(Content Description)属性对于构建可访问应用非常重要。让我们为该属性添加@string/dummy
    在右侧,Inspector面板可以改变已选择widget的各种属性。

 
 
  1. 选择ImageView并添加@string/dummycontentDescription属性
  2. 在Inspector面板,你可以看到ImageView的其他属性。修改scaleTypecenterCrop
  3. 接着,我们选择TextView,使用该面板修改text值为@string/singapore

二)手动创建Constraints

创建一个约束,你需要在widget的某个控键上点击并按住,然后拖到两一个widget的约束控键内。一旦显示绿色,你就可以松手了最终约束就会被创建。

 
 

注意:该部分讲有关手动创建约束的,需要将左上角的自动创建约束按钮关闭

 
 

在开始之前,确保ImageViewTextView在layout内。我们的目标是在容器、ImageView以及TextView之间创建约束。

假设我们想要TextView置于ImageView下方。我们可以在TextView的顶部控键与ImageView的底部控键创建一个约束,如图:

 
 

移除约束:移除某个约束只需点击指定约束的控键;移除全部约束需要点击如下按钮:

 
 

下一步,创建ImageView跟容器顶部的约束

 
 

最后,创建ImageView左右两侧的约束

 
89f057b3a8ea3e0b.png

创建基线约束 - 连接widget的基线控键到另一个的基线

 
 

三)熟悉Inspector

在此部分,我们会了解一下Inspector。它在UI编辑器的右侧。附带有已选择widget的各种相关属性,而且还显示了该视图是如何对齐与约束的。

  • 移除TextView
  • 添加ImageView底部约束

此时,UI构建起如下图:

 
 

以下部分描述了不同的元素和他们的使用方法:

Margins - widget的外围上下左右为margins。你可以点击按钮设置不同的值来改变margins。在上边截图中,margins设置为16dp

移除constraint - 在Inspector内点击连接widget与container的线,可以移除约束。当然也可以点击已设置约束的控键来移除。

相对于约束来放置widget - 当在一个widget有至少两个相对的连接,比如说顶部和底部,或者左侧和右侧,然后就可以使用滑动条来调节widget在链接中的位置。你还可以改变屏幕方向来进一步调整方位。

 
 

控制widget内部尺寸 - Inspector内部的线让你可以控制widget内部尺寸。

 
 
 
**Fixed** - 可以调整widget的宽度和高度
 
**AnySize** - 使得widget占据所有可用的控键来满足约束
 
**AnySize**应用之前
 
**AnySize**应用之后
 
**Wrap Content** - 含有text或者drawable的widget扩大到填满整个容器

四)自动创建Constraints

Autoconnect自动创建widgets之间的连接。开始之前

  • 打开res/layout/activity_main_autoconnect.xml
  • 开启Autoconnect(译注:小磁铁图标)

接下来,选中ImageView并且拖到layout的中心,如下图所示:

 
 

下一步,下方的动图展示了以下几个步骤

 
10210fd273ea1a86.png
  1. ImageView对齐顶部并使用Inspector(AnySize)来确保他扩展到两侧
  2. 放置两个button在右下角。使用Inspector面板来修改最右边button的text@string/upload以及左侧改为@string/discard
  3. 将一个TextView和一个Plain Text放到layout中。
  4. 调整TextViewPlain Text48dp。并自动创建约束。
  5. 同样的选中上传button放置到右侧。
  6. 最后放置取消button离上传button32dp的位置

五)使用Inference创建Constraints

(译注:待更新)


FAQ: (感谢Little_Mango提供的问题)

  1. 兄弟控件对齐方式只有top left bottom right,无x,y中心点对齐,这样两个View依然无法做到水平方向中点对齐。
    使用chains

  2. 父子控件间宽高约束过于简单,只有wrap_content,fixed,match,即包裹内容,匹配父容器,和绝对数值,无法做到类似子控件的宽度等于父控件的宽度的的1/4的需求。
    使用Guidelines(新版的指南好像没有介绍)

  3. 兄弟、父子之间宽高属性之间无约束,比如A控件宽度等于屏幕宽度的1/4,A控件的高度等于自身的宽度。B控件的宽等于A控件的宽度,B控件的高度等于A控件的高度的1/2.
    a. 参考 2
    b. 使用ratios
    c. 参考 b

  4. 不清楚是否能通过代码动态修改约束,如果不支持这种操作,那么类似容器垂直方向图片张数不一致这种需求也无法动态修改。
    使用 barriers

  5. 这个布局是否有布局的动画支持?如果没有,那么动画如何修改?通过修改控件的height和width是否会和约束冲突?
    动画支持


原文链接:Using ConstraintLayout to design your views


  • 如有翻译有误或者不理解的地方,请评论指正
  • 待更新的译注之后会做进一步修改翻译
  • 翻译:田浩浩
  • 邮箱:llitfkitfk@gmail.com

作者:llitfk_DockOne
链接:https://www.jianshu.com/p/a8b49ff64cd3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Android ConstraintLayout详解(from jianshu)的更多相关文章

  1. Android ConstraintLayout详解

    1. 概述 在本篇文章中,你会学习到有关ConstraintLayout -- 一种构建于弹性Constraints(约束)系统的新型Android Layout.最终你将会在Android Stud ...

  2. 约束布局ConstraintLayout详解

    约束布局ConstraintLayout详解 转 https://www.jianshu.com/p/17ec9bd6ca8a 目录 1.介绍 2.为什么要用ConstraintLayout 3.如何 ...

  3. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  4. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  5. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  6. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  7. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  8. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  9. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

随机推荐

  1. Django + Uwsgi + Nginx 实现生产环境 项目部署

    内容: uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django项目? Django项目的部署可以有很多方式,采用nginx+uwsg ...

  2. office2013安装与卸载

    一.office2013卸载不干净,重新安装的时候就会报错.下面是博主卸载的步骤: 第一步:下载office官方卸载工具 ,链接:http://pan.baidu.com/s/1nvuoEYd 密码: ...

  3. 关于一点儿对仓储(Repository)的理解

    仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...

  4. Django开发密码管理表实例【附源码】

    文章及代码比较基础,适合初.中级人员,高手略过 阅读此篇文章你可以: 获取一个Django实现增删改查的案例源码 了解数据加密的使用场景和方法以及如何在Python3中使用 背景介绍 DBA需要维护一 ...

  5. 33-hadoop-cdh搭建coudemanager安装

    http://www.aboutyun.com/thread-9219-1-1.html  非常强大的博客 ! ! ! 1, cdh简介 CDH (Cloudera’s Distribution, i ...

  6. Linux内核升级导致无法启动,Kernel panic - not syncing Unable to mount root fs on unknown block(0,0)

    问题原因:内核的某次升级,导致系统无法启动. 首先进入recovery模式:引导界面选择-->Ubuntu高级-->出现的选项中选择能够启动的recovery模式(几个内核版本分别试一下) ...

  7. Java 8 新特性-菜鸟教程 (3) -Java 8 函数式接口

    Java 8 函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为lambda表达式. 函数式接 ...

  8. 使用keepalived实现双机热备

    通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.下面来以keepalived结合tom ...

  9. Qt编写自定义控件12-进度仪表盘

    前言 进度仪表盘主要应用场景是标识一个任务进度完成的状况等,可以自由的设置范围值和当前值,为了美观还提供了四种指示器(圆形指示器/指针指示器/圆角指针指示器/三角形指示器),各种颜色都可以设置,其中的 ...

  10. NPOI导出Excel及使用问题

    NPOI导出Excel及使用问题 因为最近公司质管部门提出了一个统计报表的需求:要求导出一个2016及2017年度深圳区域的所有供应商的费用成本计算--一个22列的Excel表,其中还包括多列的合并单 ...