Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >还在用Android正经布局来写页面吗?

还在用Android正经布局来写页面吗?

作者头像
用户2802329
发布于 2018-09-21 03:31:46
发布于 2018-09-21 03:31:46
1.4K00
代码可运行
举报
文章被收录于专栏:Android先生Android先生
运行总次数:0
代码可运行

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

介绍

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

用法简介

1、xxx_toyyyOf属性

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中的toLeftOftoRightOf,上面的属性中还有一个关于Baseline的,我们通过另外一张图来了解一下:

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

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

2、设置margin边距

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

3、隐藏空间设置边距

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

  • layout_goneMarginStart
  • layout_goneMarginEnd
  • layout_goneMarginLeft
  • layout_goneMarginTop
  • layout_goneMarginRight
  • layout_goneMarginBottom

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

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

4、居中和偏移

  • 水平居中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1app:layout_constraintLeft_toLeftOf="parent"
2app:layout_constraintRight_toRightOf="parent"

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

  • 垂直居中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1app:layout_constraintTop_toTopOf="parent"
2app:layout_constraintBottom_toBottomOf="parent"
  • 中心对齐
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1app:layout_constraintLeft_toLeftOf="parent"
2app:layout_constraintRight_toRightOf="parent"
3app:layout_constraintTop_toTopOf="parent"
4app:layout_constraintBottom_toBottomOf="parent"

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1<LinearLayout>
 2
 3    <View
 4        android:layout_width="0dp"
 5        android:layout_height="match_parent"
 6        android:layout_weight="1" />
 7
 8    <Button
 9        android:layout_width="100dp"
10        android:layout_height="match_parent" />
11
12    <View
13        android:layout_width="0dp"
14        android:layout_height="match_parent"
15        android:layout_weight="3" />
16
17</LinearLayout>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1<android.support.constraint.ConstraintLayout>
 2
 3    <Button 
 4        android:id="@+id/button"
 5        app:layout_constraintHorizontal_bias="0.33"
 6        app:layout_constraintLeft_toLeftOf="parent"
 7        app:layout_constraintRight_toRightOf="parent />
 8
 9</android.support.constraint.ConstraintLayout>
10

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

5、CircleRadius角度定位(在版本1.1中加入)

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

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

6、尺寸约束

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

  • 特定数值,比如123dp
  • 使用wrap_content,控件将自己计算大小
  • 使用0dp,相当于`MATCH_CONSTRAINT`

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

下面我们来看一个例子:

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

7、设置宽高比例

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

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

8、Chains(链)

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

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

  • CHAIN_SPREAD模式:元素将展开(默认样式)
  • 加权链CHAIN_SPREAD模式:如果给元素的宽或者高设置了MATCH_CONSTRAINT(0dp),它们将分割宽高方向上的可用空间
  • CHAIN_SPREAD_INSIDE模式:类似于SPREAD,但链的端点不会分散
  • `CHAIN_PACKED`模式:链条的元素将被捆绑在一起。然后,子项的水平或垂直偏差属性将影响该链元素的定位

9、辅助布局Guildline

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

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

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

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

  • layout_constraintGuide_begin:指定辅助线距离左边或者顶部的距离
  • layout_constraintGuide_end:指定辅助线距离右边或者底部的距离
  • `layout_constraintGuide_percent`:指定在父控件中的宽度或高度的百分比

代码

以上demo的代码全都上传至

Github:https://github.com/24Kshign/ConstraintLayoutTest

最强布局解析,有兴趣的童鞋可以自行下载看看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT先森养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
对于初学者来说,可能觉得ConstraintLayout属性多,且属性长而弃用它,那你错失了这个大宝贝。
程序员徐公
2023/03/08
1.8K0
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
笔记74 | 学习掌握ConstraintLayout的基本属性
最近一个礼拜业余时间都在搞我的淘宝店铺,有兴趣的都可搜一下:吉安车品,主营汽车脚垫/后备箱垫/座垫,还在打基础阶段,不急,慢慢搞,当业余爱好去买卖;当然吃饭手艺功夫自然也不能丢,为下个月的变数准备,今天开始复习/学习一些基础内容,今天的笔记是ConstraintLayout的几个属性。 1、Circular positioning(圆形定位) 标题后面的中文是自己翻译的,可能不是很准确。 官方文档是这么介绍的: You can constrain a widget center relative to an
项勇
2018/06/19
1.3K0
ConstraintLayout(约束布局)的使用
这些属性会引用另一个控件的id或者parent(这会引用父容器,即ConstraintLayout)
用户1205080
2018/10/18
2.4K0
ConstraintLayout(约束布局)的使用
ConstraintLayout 入门指南
本文主要介绍了ConstraintLayout从诞生到如今在Android App开发中的重要性、使用场景、优缺点,以及社区的发展状况。通过实际案例和设计模式,展示了ConstraintLayout在移动开发领域的魅力,并针对实际开发中遇到的问题提供了一些解决方案。
QQ音乐技术团队
2017/09/19
2.6K0
ConstraintLayout 入门指南
项目需求讨论 — ConstraintLayout 详细使用教程
关于ConstraintLayout的文章网上一抓一大把,而且ConstraintLayout在16年就已经出来了,但是我一直没有试着去使用(别问我为什么不去使用,当然是因为懒啊)。毕竟前面的LinearLayout搭配RelativeLayout用习惯了,但是毕竟能减少布局的嵌套。还是要抱着多学习的方式去接触。所以写下文章作为总结。
青蛙要fly
2018/08/29
1.8K0
项目需求讨论 — ConstraintLayout 详细使用教程
Android ConstraintLayout布局详解[通俗易懂]
之前在使用Android Studio新建项目的时候,发现MainActivity的默认布局从RelativeLayout变成了ConstraintLayout。当时就对这个ConstraintLayout很好奇,就研究了一下。发觉确实很强大,在此做个总结。
全栈程序员站长
2022/08/22
1.8K0
Android ConstraintLayout布局详解[通俗易懂]
再学一次ConstraintLayout 一些新特性
首先,ConstraintLayout是一个新的布局,它是直接继承自ViewGroup的,所以在兼容性方面是非常好的.官方称可以兼容到API 9.可以放心食用.
Android技术干货分享
2019/03/28
1.8K0
再学一次ConstraintLayout 一些新特性
ConstraintLayout使用汇总
在这里我要向大家介绍ConstraintLayout,它是一种布局方法,可以帮助我们在对Android进行布局时减少对布局层次的嵌套,进而提高app的性能。
Rouse
2019/07/16
8690
【约束布局】ConstraintLayout 屏幕适配案例 ( 使用代码生成约束布局控件属性 )
文章目录 一、ConstraintLayout 屏幕适配案例 二、使用代码生成约束布局 一、ConstraintLayout 屏幕适配案例 ---- ConstraintLayout 屏幕适配案例 :
韩曙亮
2023/03/30
4960
【约束布局】ConstraintLayout 屏幕适配案例 ( 使用代码生成约束布局控件属性 )
ConstraintLayout约束控件详解
简介 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束控件–ConstraintLayout。一种构建于弹性Constraints(约束)系统
xiangzhihong
2018/02/06
1.3K0
ConstraintLayout约束控件详解
细细品读!深入浅出,官方文档看ConstraintLayout
之前品读了郭霖大神写的《Android新特性介绍,ConstraintLayout完全解析》,受其感染,写了一篇《未来布局之星——ConstraintLayout》,回过头来看,感觉这一篇文章太注重可视化操作,于是去翻阅了一下ConstraintLayout的官方文档,决定从官方文档的角度在代码层面来了解一下ConstraintLayout。
代码咖啡
2018/08/28
1K0
细细品读!深入浅出,官方文档看ConstraintLayout
Android ConstraintLayout百分比布局使用详解
Android ConstraintLayout是谷歌推出替代PrecentLayout的组件。支持相对布局、线性布局、帧布局,笔者看来更像是FrameLayout 、LinearLayout、RelativeLayout三者的结合体,并且比这三者更强大的是实现了百分比布局,大家都知道安卓碎片严重,使用百分比适配,那么将彻底解决适配问题。
全栈程序员站长
2022/08/30
6.3K0
Android ConstraintLayout百分比布局使用详解
1.android布局-ConstraintLayout-约束布局
ConstraintLayout 是什么? ConstraintLayout ConstraintLayout 怎么用? 基本用法 layout_constraint[当前控件位置]_[目标控件位置]="[目标控件ID]" 1.上下排列 a b b: app:layout_constraintTop_toBottomOf="a" 实例: <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.an
tea9
2022/07/16
5650
1.android布局-ConstraintLayout-约束布局
【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
文章目录 一. ConstraintLayout 简介 1. 引入 约束 布局 ( 1 ) 约束性布局 作用 和 简介 2. 约束 简介 ( 1 ) 约束个数要求 ( 2 ) 约束设置 与 显示位置 3. ConstraintLayout 引入 ( 1 ) ConstraintLayout 依赖添加 ( 2 ) ConstraintLayout 转换 与 添加 二. ConstraintLayout 约束 的 基本操作 1. 约束基本操作 ( 1 ) Design ( 设计 ) 和 Bluepr
韩曙亮
2023/03/27
6.6K0
【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )
① ConstraintSet 约束集 概念 : ConstraintSet 约束集 顾名思义 , 就是 约束属性的集合 , 其表示 约束布局 ( ConstraintLayout ) 中 所有的组件 的 约束条件 , 尺寸 , 边距 , 等 约束属性 ;
韩曙亮
2023/03/27
3.4K0
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )
Constraintlayout约束布局三问
Constraintlayout——约束布局,作为Jetpack的一个组件推出。今天的面试三问就是关于布局的:
码上积木
2020/09/27
1.7K0
ConstraintLayout 使用简介一 背景二 demo三 进一步升级打怪四 更多
一 背景 ConstraintLayout 是目前是android studio 2.2 以后的默认根布局。 到目前为止,大家还是习惯常用的布局。同事先尝试了下ConstraintLayout优化布局
用户1127566
2018/06/06
2.5K0
ConstraintLayout概要
约束布局ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。
码客说
2020/07/03
9630
一文看懂ConstraintLayout的用法
ConstraintLayout 相对于 RelativeLayout来说性能更好,布局上也更加灵活。在最新的Google Android开发文档中是推荐使用 ConstraintLayout的,下面来看看具体用法。
阳仔
2019/07/30
8180
一文看懂ConstraintLayout的用法
【约束布局】ConstraintLayout 偏移 ( Bias ) 计算方式详解 ( 缝隙比例 | 计算公式 | 图解 | 测量图 + 公式 )
水平偏移 ( app:layout_constraintHorizontal_bias ) :
韩曙亮
2023/03/27
2.3K0
【约束布局】ConstraintLayout 偏移 ( Bias ) 计算方式详解 ( 缝隙比例 | 计算公式 | 图解 | 测量图 + 公式 )
推荐阅读
相关推荐
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验