Android ConstraintLayout详解「建议收藏」

Android ConstraintLayout详解

大家好,又见面了,我是全栈君。

1. 概述

1240

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

收获

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

需求

2. 获取示例代码

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

1240

图示 A

控键类型

1240

图示 B:不同类型的控键

  • 调整尺寸控键 – 类似于其他设计/绘图应用,该控键允许你调整widget尺寸

    1240

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

    1240

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

    1240

《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选项

1240

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

1240

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

strip

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

    1240

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

1240

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

二)手动创建Constraints

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

strip

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

1240

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

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

strip

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

1240

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

strip

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

strip

89f057b3a8ea3e0b.png

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

strip

三)熟悉Inspector

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

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

此时,UI构建起如下图:

1240

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

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

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

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

strip

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

1240

1240

Fixed – 可以调整widget的宽度和高度

1240

AnySize – 使得widget占据所有可用的控键来满足约束

1240

AnySize应用之前

1240

AnySize应用之后

1240

Wrap Content – 含有text或者drawable的widget扩大到填满整个容器

四)自动创建Constraints

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

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

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

strip

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

strip

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

(译注:待更新)

原文链接:Using ConstraintLayout to design your views

转载于:https://my.oschina.net/bv10000/blog/919396

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108421.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

    CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)CIDR地址块及其子网划分1.CIDR概述及其地址块计算  CIDR中文全称是无分类域间路由选择,英文全称是ClasslessInter-DomainRouting,在平常,大家多称之为无分类编址,它也是构成超网的一种技术实现。2.CIDR子网划分3.总结

    2022年4月29日
    98
  • 可浮动placeholder,让你的登录不再枯燥

    可浮动placeholder,让你的登录不再枯燥前言在登录twitter的时候发现他的输入框的placeholder是可以浮动的。当输入框获取到焦点的时候,placeholder会跑到上面去。我觉得这样的登录方式的好处是:可以减少一个label,同时往上浮动又可以保证用户在输入的时候知道输入什么内容。pointer-eventspointer-events属性设置HTML元素如何响应鼠标/触摸事件/单击/点击事件以及光标是否可见。虽然pointer-events属性有11个可能的值,但其中8个值都用于SVG。任何HTMl元素的三个

    2022年7月13日
    14
  • 操作系统中并发和并行的区别在于_线程是并行还是并发

    操作系统中并发和并行的区别在于_线程是并行还是并发一、教材解释:·并行是指两个或者多个事件在同一时刻发生,而并发是指两个或者多个事件在同一时间间隔发生·并行是在不同实体上的多个事件,并发是在同一实体上的多个事件二、c语言站长公众号解释:1、并发早期计算机的CPU都是单核的,一个CPU在同一时间只能执行一个进程或线程,当系统中有多个进程或线程等待执行时,CPU只能执行完一个再执行下一个。计算机在运行过程中,有很多指令会设计i/o操作,而i/o操作又是相当耗时间的,速度远远低于CPU,这导致CPU经常处于空闲状态,只能等待i/o操作完成

    2025年6月9日
    2
  • 数据库概念结构设计的方法和步骤_概念结构设计是整个数据库

    数据库概念结构设计的方法和步骤_概念结构设计是整个数据库概念结构设计什么是概念结构设计将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定概念结构设计是整个数据库设计的关键概念结构设计的特点(1)能真实、充分地反映现实世界(2)易于理解(3)易于更改(4)易于向关系、网状、层次等各种数据模型转换

    2022年10月12日
    1
  • lm算法的实现方法_信赖域算法

    lm算法的实现方法_信赖域算法完整文章请查看这里。转载请注明出处:本文来自learnhard的博客:http://www.codelast.com/ & http://blog.csdn.net/learnhard/,并保持文章的完整性。 LM算法可用于解决非线性最小二乘问题。多用于曲线拟合等场合。LM算法的实现并不难,这里不讨论使用MATLAB等工具直接得到结果的过程,使用那些工具对于算法编程能力的提高无任何益处。 LM算法

    2022年9月27日
    3
  • js二维码生成

    详细介绍可以查看API网站:http://code.ciaoca.com/javascript/qrcode/ (前端开发仓库)一、引入js文件&amp;lt;!– 第一步:引进js文件 –&amp;gt; &amp;lt;script type=”text/javascript” src=”js/jquery.min.js”&amp;gt; \ &amp;lt;script type=”text/java…

    2021年11月30日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号