使用ConstraintLayout(约束布局)构建响应式UI

   2017-01-06 0
核心提示:ConstraintLayout (约束布局)是Google IO 2016推出的Android新布局方式。 以下内容翻自官方文档。 ConstraintLayout 允许您使用扁平的层级(不用嵌套View Group)创建大型复杂的布局。与 RelativeLayout 类似,它通过相邻的view和父layout的相对关系来确定位置

ConstraintLayout (约束布局)是Google IO 2016推出的Android新布局方式。

以下内容翻自官方文档。

ConstraintLayout 允许您使用扁平的层级(不用嵌套View Group)创建大型复杂的布局。与 RelativeLayout 类似,它通过相邻的view和父layout的相对关系来确定位置,但比 RelativeLayout 更加灵活,更容易通过Android Studio的布局编辑器实现想要的效果。

ConstraintLayout 的所有功能都可以直接通过 Layout Editor 可视化工具实现,因为布局API和Layout Editor互相做了特别优化。所以您 只需要拖放布不必编写一行代码构建ConstraintLayout布局。

使用ConstraintLayout(约束布局)构建响应式UI 图1. Layout Editor 编辑 ConstraintLayout

ConstraintLayout的Api库兼容 Android 2.3 (API level 9)或更高版本,新的Layout Editor需要Android Studio 2.2或更高版本

本文提供了在Android Studio中使用ContraintLayout构建布局的向导,如果您对Layout Editor更兴趣,参见 Build a UI with Layout Editor.

约束概览

ConstraintLayout 中定义一个view的位置,您必须为这个view添加至少两条约束。每个约束代表与另一个view、父layout,或不可见的向导线的连系或对齐。每个约束沿着水平或垂直坐标定义了view的位置,所以每个view必须在每个轴上有一个最小约束,但通常需要多个。

当您把一个view拖进Layout Editor时,即便没有约束,它也会留在你释放时的位置。然而,这仅仅是让您更容易编辑,如果一个view没有约束,当您在设备中运行时,它始终会在左上角显示。

在图2中,布局在编辑器中看起来很好,但 TextView B 没有垂直约束。当这个布局在设备中运行时, TextView B 会与ImageView的左右边缘水平对齐,但出现在屏幕的最顶部,因为它没有垂直约束.

使用ConstraintLayout(约束布局)构建响应式UI 图2: TextView B缺少垂直约束

使用ConstraintLayout(约束布局)构建响应式UI 图3:TextView B现在相对ImageView水平垂直约束

尽管缺少约束不会导致编译错误,Layout Editor还是会在工具栏上将缺少约束显示为错误。

使用ConstraintLayout(约束布局)构建响应式UI

查看错误和其他警告,点击错误数字图标。为了帮您避免缺少约束,Layout Editor可以使用Autoconnect和infer constraints 特性,帮您自动添加约束。

为您的项目添加ConstraintLayout

要在项目中使用 ConstraintLayout ,跟随以下步骤:

1.确保您有最新的约束布局库:

– 点击 Tools > Android > SDK Manager .

– 点击 SDK Tools 选项卡

– 展开 Support Repository ,勾选 ConstraintLayout for AndroidSolver for ConstraintLayout ,勾选 Show Package Details ,记住您下载的版本(下面会用到)

– 点击 OK

– 在module级别(默认app)的build.gradle里添加ConstraintLayout库依赖

dependencies {
        compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    }

您下载的版本可能更高,所以确保版本号与下载的匹配.

  • 在工具栏或同步通知里,点击 Sync Project with Gradle Files

现在,您已经准备好使用 ConstraintLayout 构建布局了

转换布局

转换现有布局到ConstraintLayout,跟随以下步骤:

1. 在Android Studio中打开layout,在编辑器的底部,点击Design标签,

2. 在Component Tree窗口,右击layout,点击 Convert layout to ConstraintLayout
使用ConstraintLayout(约束布局)构建响应式UI

图4:转换布局菜单

创建新布局

创建一个新的ConstraintLayut,跟随以下步骤:

1. 在 Project 窗口任意处点击,选择 File > New > XML > Layout XML .

2. 输入layout文件名, android.support.constraint.ConstraintLayout 作为Root Tag

3. 点击 Finish

添加约束

Palette 拖动一个view到编辑器里开始。当您添加一个view到 ConstraintLayout 里时,它展示成一个包围的盒子,四角带方形大小调整把手,四边的中间带圆形约束把手。

点击View选中它,点击并拖住一个约束把手,拖动到可用的锚点上(另一个view、layout、引导线的边缘),当您释放时,约束就生成了,两个view间带一个默认的margin值

演示视频

创建约束时,记住以下准则:

  • 每个view至少有两个约束,一个水平,一个垂直
  • 同一平面上,您可以只在一个约束把手和一个锚点间创建约束。所以一个view的垂直平面(左右边) 可以只被另一个垂直平面约束;基线可以只被其他基线约束
  • 每个约束把手只能创建一个约束,但是同一个锚点上可以创建多个约束(不同的view)

如果要删除约束,选中view,点击约束把手

当您添加了相反的约束时,约束线会变成弯弯曲曲的弹簧状。

使用ConstraintLayout(约束布局)构建响应式UI

这个效果当view的size设置成 fixedwrap_content 时最明显,它会让view展示在约束的中间,如果您希望view扩展它的尺寸到约束上,,或者如果您 想保持当前大小,但是移动view,以便它不居中,可以

有很多方法可以限制一个视图,但是下面的约束类型提供的基本构建块。

父级约束

连接view的一边到相应的layout边缘,在图5中,view的左边缘连到了父级的左边缘。

使用ConstraintLayout(约束布局)构建响应式UI

图5 相对父级的水平约束

位置约束

为两个view水平或垂直方向定义外观规则。图6中,一个 Button 被约束在一个 ImageView 下面,间隔24dp

使用ConstraintLayout(约束布局)构建响应式UI

图6 垂直位置约束

对齐约束

一个view的边缘与另一个view的同一边缘对齐

图7中, Button 的左边缘与ImageView的左边缘对齐

您可以通过向内拖动view调整对齐(增加margin,不支持向外拖,即margin不能为负值)

使用ConstraintLayout(约束布局)构建响应式UI

图7 水平对齐约束

使用ConstraintLayout(约束布局)构建响应式UI

图8 水平对齐约束 offset

基线对齐约束

对齐一个view的文本基线到另一个view的文本基线。

图9中, TextView 的第一行与 Button 的文本对齐

创建一个基线约束,您可以选中view,点击B,基线就会显示,鼠标拖到另一个view的基线上即可(原文描述有点不一样,可能是Android Studio老版本)

使用ConstraintLayout(约束布局)构建响应式UI

与引导线约束

您可以添加水平或垂直的引导线,基于它创建约束。您可以在layout内部用dp单位或者百分比放置引导线,相对layout边缘。

创建引导线:点击工具栏上的 Guidelines 图标,选择 Add Vertical GuidelineAdd Horizontal Guideline

点击引导线顶部的小圆点,切换百分比以及相对边缘(上下,或左右)

引导线对用户不可见

使用Autoconnect和Infer Constraints

Autoconnect 会为您添加到layout里的每一个view创建两个或更多约束。 Autoconnect 默认关闭,您可以点击 Layout Editor 工具栏上的 Turn on Autoconnect 图标开启。

当开启后, Autoconnect 会在您添加view后创建约束,它不会为已经存在的view(开启前添加)创建约束。如果您在约束创建后拖动view,约束不会改变(虽然margin会),所以如果您要大幅度改变view位置,您必须删除约束。

作为另一种选择,您也可以点击 Infer Constraints 来为layout里的所有view创建约束.

Infer Constraints (推断约束)是一次性的动作,它通过扫描整个layout来推断所有view的最有效设置,所以它可能会为两个很远的view创建约束。 Autoconnect 只与最近的元素创建约束。这两种情况下,你都可以通过点击约束把手删除约束,创建新的约束.

调整视图大小

您可以使用view每个角上的把手调整大小,但这么做会硬编码(Hard codes)宽和高,这是您应该避免的,因为硬编码无法适配不同的内容的屏幕尺寸。要选择不同的动态尺寸模式,或定义指定大小,点击view,打开编辑器右边的属性窗口,在窗口的顶部是视图查看器,如图10。

使用ConstraintLayout(约束布局)构建响应式UI

图10 属性窗口,包含视图尺寸(1),边距(2),约束偏移(3)

灰色的区域展示了选中的view,距形内的符号展示了宽高设置:

  • 使用ConstraintLayout(约束布局)构建响应式UI Wrap Content View会根据内容的需要自动展开
  • 使用ConstraintLayout(约束布局)构建响应式UI Any Size View会自动展开来匹配约束。实际值是0dp,因为view没有期望的尺寸,但它会为匹配约束重置大小。然而,如果给定的尺寸只有一个约束,视图会扩展以适应内容。对此的另一种理解是 match constraints (而不是 match_parent ),因为它在计算约束和边距的限制后,尽可能多地展开视图。
  • 使用ConstraintLayout(约束布局)构建响应式UI Fixed 您在编辑器里通过调整view大小,在下面的文本框里指定了尺寸

要在这几种模式间切换,在上面的图形上单击。

==注意:您不应该在ConstraintLayout上使用 match_parent ,用 Any Size 0dp 代替==

调整约束偏移

当您给一个view的两边都添加了约束(并且view的尺寸是都是fixed或者wrap content),默认情况下,view会在两个锚点间居中。当一个view居中时,偏移是50%.您可以通过拖动属性窗口中的偏移滑动条或拖动view来调整。

如果您想要view扩展它的尺寸到匹配约束,

调整view间距

确保您的view间隔均匀,点击工具栏上的Margin 8 ,为您添加的每个view选择默认的间距。这个按钮会展示您当前的默认间距设置。任何对默认间距的修改,仅对修改后新增的约束生效。

使用ConstraintLayout(约束布局)构建响应式UI

您可以通过属性窗口单独修改每个view的间距,(在图10中,边距被设为16dp).

工具中提供的所有边距都是8的倍数,以帮助您的view符合Material Design的 8dp square grid recommendations

© 2017, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接!应用开发笔记

 
标签: Android Studio
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 说一说Android Studio和IDEA中一个很有用的内存调试插件
    说一说Android Studio和IDEA中一个很有用的内存
    JetBrains JVM Debugger Memory View plugin 在我最近的研发活动期间寻找新的工具,以提高我的开发经验,使Android Studio的生活更轻松,我发现一个有用的插件,我从来没有听说过。 这就是为什么,我决定写这个强大的工具,它如何帮助我与内存调试我的应用程
  • 安卓中通知功能的具体实现
    安卓中通知功能的具体实现
    通知[Notification]是Android中比较有特色的功能,当某个应用程序希望给用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知实现。使用通知的步骤1、需要一个NotificationManager来获得NotificationManager manager = (NotificationManager
    02-05 安卓开发
  • Android view系统分析-setContentView
    Android view系统分析-setContentView
    第一天上班,列了一下今年要学习的东西。主要就是深入学习Android相关的系统源代码,夯实基础。对于学习Android系统源代码,也没什么大概,就从我们平常使用最基础的东西学起,也就是从view这个切入点开始学习Android的源码,在没分析源码之前,我们有的时候
    02-05 安卓开发
  • 如何进行网络视频截图/获取视频的缩略图
    如何进行网络视频截图/获取视频的缩略图
    小编导读:获取视频的缩略图,截图正在播放的视频某一帧,是在音视频开发中,常遇到的问题。本文是主要用于点播中截图视频,同时还可以获取点播视频的缩略图进行显示,留下一个问题,如下图所示, 如果要获取直播中节目视频缩略图,该怎么做呢?(ps:直播是直
  • Android NDK 层发起 HTTP 请求的问题及解决
    Android NDK 层发起 HTTP 请求的问题及解决
    前言新的一年,大家新年快乐~~鸡年大吉!本次给大家带来何老师的最新文章~虽然何老师还在过节,但依然放心不下广大开发者,在此佳节还未结束之际,给大家带来最新的技术分享~ 事件的起因不说了,总之是需要实现一个 NDK 层的网络请求。为了多端适用,还是选择
  • SDK热更之如何在SDK代码中自动插桩及如何生成补
    写在前面本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.htmlSDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix这篇文章主要介绍一下SDK热更
  • 安装量破千万的第一个产品,我总结了3句话
    安装量破千万的第一个产品,我总结了3句话
    在今天的文章中,作者回顾了自己的第一个产品,他说“我做的第一款产品,是我的一块里程碑。”一起来看看~背景老牌大型互联网公司,部门内部创业的一个项目。我作为产品经理,也是第一次做产品经理,主导产品项目。实际上,项目初期包括我和安卓开发2个人。开
  • 移动周刊第 176 期:Android 知识梳理
    移动周刊第 176 期:Android 知识梳理
    写在前面 本期移动周刊第 176 期如约而至,聚焦 Android、iOS、VR/AR/MR、直播等前沿移动开发技术,收录一周最热点,解读开发技巧,每周三移动周刊抢先看,我们希望从中能够让你有一些收获,如果你有好的文章以及优化建议,请发送邮件至mobilehub@csdn.net,
  • Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突
    Android插件化(六): OpenAtlasの改写aapt以防
    引言Android应用程序的编译中,负责资源打包的是aapt,如果不对打包后的资源ID进行控制,就会导致插件中的资源ID冲突。所以,我们需要改写aapt的源码,以达到通过某种方式传递资源ID的Package ID,通过aapt打包时获取到这个Package ID并且应用才插件资源的命名
    02-05 安卓开发
  • Android架构(一)MVP架构在Android中的实践
    Android架构(一)MVP架构在Android中的实践
    为什么要重视程序的架构设计 对程序进行架构设计的原因,归根结底是为了 提高生产力 。通过设计是程序模块化,做到模块内部的 高聚合 和模块之间的 低耦合 (如依赖注入就是低耦合的集中体现)。 这样做的好处是使得程序开发过程中,开发人员主需要专注于一点,
    02-05 安卓开发
点击排行