原文链接:https://mp.weixin.qq.com/s/Mi3cK7xujmEMI_rc51-r4g

RelativeLayoutLinearLayout等常用布局相信大家早已耳熟能详,今天给大家介绍一款新的布局方式「弹性布局」--FlexboxLayout。

Flex是Flexible Box的缩写,意为「弹性布局」,在前端css样式中应用甚为广泛,之前做过React-Native和微信小程序,页面布局大多使用flex弹性布局,可以在不同屏幕尺寸上提供一致的布局结构,可以简便、完整、响应式地实现各种页面布局,今天为大家打开Android移动端的flex布局大门--FlexboxLayout,在android中我们经常所见的标签、流式布局等都可以用FlexboxLayout来实现。

安装

build 依赖

dependencies {
implementation 'com.google.android:flexbox:1.0.0'
}

FlexboxLayout 属性介绍

flexDirection

flex-direction 属性决定主轴的方向(即内部子元素的排列方向)。

  • row(默认值):水平显示,起点在左端
  • row_reverse:水平显示,起点在右端,与row相反的顺序
  • column:垂直显示,起点在顶部
  • column_reverse:垂直显示,起点在底部,与column相反的顺序

xml中使用app:flexDirection="row",代码中使用flexboxLayout.setFlexDirection(FlexDirection.ROW)

这里为了演示布局紧凑,不让元素撑满整个布局,xml里设置了app:alignItems="flex_start"app:alignContent="flex_start",后续有对alignItemsalignContent的属性介绍,读者可以去除这两个属性看看演示效果。

flexWrap

flexWrap 决定是否换行

  • nowrap(默认值):不换行
  • wrap:按正常方向换行,第一行在上方
  • wrap_reverse:按反方向换行,第一行在下方

xml中使用app:flexWrap="nowrap",代码中使用flexboxLayout.setFlexWrap(FlexWrap.NOWRAP)

justifyContent

justifyContent决定元素在主轴上的对齐方式

  • flex_start(默认值):主轴方向起点对齐
  • flex_end:主轴方向终点对齐
  • center: 主轴方向居中对齐
  • space_between:主轴方向两端对齐,元素之间的间隔都相等。
  • space-around:每个元素两侧的间隔相等。所以,元素之间的间隔比元素与布局边框的间隔大一倍。

xml中使用app:justifyContent="flex_start",代码中使用flexboxLayout.setJustifyContent(JustifyContent.FLEX_START)

注意这里是 主轴方向 上的对齐方式即flexDirection属性,例如主轴如果是row水平方向的,那么center属性就是水平居中,如果是column,那么就是垂直方向居中。

alignItems

alignItems决定元素在交叉轴方向上的对齐方式,「交叉轴」 我理解的就是 与主轴交叉垂直的方向,比如主轴是水平的,那么交叉轴就是垂直方向的

  • stretch(默认值):交叉轴方向占满整个父布局。
  • flex_start交叉轴的起点对齐
  • flex_end交叉轴的终点对齐。
  • center交叉轴的居中对齐
  • baseline元素第一行文字的基线对齐

默认值是stretch,不管元素布局设置的宽高多少,都会在交叉轴方向占满父布局,例如flexDirection是默认row水平方向,那么元素就会在垂直方向撑满父布局。

一般会选择使用flex_start属性,可以自由控制元素的大小。

alignContent

alignContent决定了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

  • stretch(默认值):轴线占满整个交叉轴。
  • flex_start 交叉轴方向起点对齐
  • flex_end 交叉轴方向终点对齐
  • center 交叉轴方向居中对齐
  • space_between 交叉轴方向两端对齐,元素之间的间隔都相等
  • space_around 每个元素两侧的间隔相等。所以,元素之间的间隔比元素与布局边框的间隔大一倍

alignContent是在多行的情况下起作用。

justifyContent设置主轴方向的对齐方式,alignContent是设置交叉轴方向的对齐方式。例如元素是水平方向换行,justifyContent设置center属性就是水平居中,alignContent设置center属性就是垂直居中。

divider属性

描述了元素间的分割线

  • showDividerHorizontal四个属性none | beginning | middle | end,beginning显示线条在布局的上面,end显示线条在布局的下面
  • dividerDrawableHorizontal 水平分隔线放在伸缩线之间
  • showDividerVertical beginning显示线条在布局的左边,end显示线条在布局的右边
  • dividerDrawableVertical 垂直分隔线放在伸缩线之间
  • showDivider 配合dividerDrawableHorizontal就是showDividerHorizontal的效果,配合dividerDrawableVertical就是showDividerVertical的效果,配合dividerDrawable就是显示水平和垂直方向的线条
  • dividerDrawable drawable属性,配合showDivider可以显示水平和垂直方向的线条
app:alignContent="flex_start"
app:alignItems="flex_start"
app:flexWrap="wrap"
app:dividerDrawable="@drawable/divider"
app:showDivider="beginning|end|middle"

子元素属性

除了给FlexboxLayout自身设置属性,还可以给到子元素设置属性

layout_order

layout_order可以改变元素排列顺序,默认值是1,按顺序排列的,值越大,排列越靠后

文字1的textView的属性app:layout_order="2",其余为默认1

layout_flexGrow

layout_flexGrow决定元素的放大比例,默认不放大,值为0。如果一个元素的layout_flexGrow 属性为2,其他元素为1,则前者占据的剩余空间将比其他的多一倍。属性类似于LinearLayoutweight属性。

三个view的app:layout_flexGrow值分别为1、1、2

layout_flexShrink

layout_flexShrink 决定元素的缩小比例,默认为1,即当空间不足是,该元素被缩小。值越大,缩小比例越大,0的话则不缩小。空间足够的情况,属性无效。

三个view的app:layout_flexShrink值分别为2、1、1

layout_alignSelf

layout_alignSelf允许单个子元素有与其他子元素不一样的对齐方式,默认值为auto,继承父元素的alignItems 属性,其余属性值同alignItems属性

第一个viewapp:layout_alignSelf="center"垂直居中

layout_flexBasisPercent

layout_flexBasisPercent 决定了在分配多余空间之前,子元素占据的主轴空间的百分比。默认为自身大小

第一个viewapp:layout_flexBasisPercent="50%"水平占比50%

与recyclerView搭配

FlexboxLayout的应用可谓广泛,主流的tag标签 流式布局就可以使用FlexboxLayout动态添加view去实现,例外还可以使用RecyclerView的布局管理器FlexboxLayoutManager来完成流式布局。

FlexboxLayoutManager manager = new FlexboxLayoutManager(this);
manager.setFlexDirection(FlexDirection.ROW);
manager.setFlexWrap(FlexWrap.WRAP);
recyclerView.setLayoutManager(manager);

同样图片的流式布局原理相通,这里就不一一列举。

最后附上github地址:https://github.com/taixiang/flexboxLayout

欢迎关注我的博客:https://blog.manjiexiang.cn/

欢迎关注微信号:春风十里不如认识你

Android 弹性布局 FlexboxLayout了解一下的更多相关文章

  1. FlexboxLayout——Android弹性布局

    FlexboxLayout是一个Android平台上与CSS的 Flexible box 弹性盒子布局模块 有相似功能的库.Flexbox 是CSS 的一种布局方案,可以简单.快捷的实现复杂布局. F ...

  2. Android 布局开发之百分比布局、弹性布局

    1.百分比布局 很简单,超级简单.引用之后就可以使用了. compile 'com.android.support:percent:23+' git地址: https://github.com/Jul ...

  3. Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)

    Android可伸缩布局-FlexboxLayout(支持RecyclerView集成) 1 . 前言 前几天看到Google官方的博客介绍了Google开源的一个强大的布局-FlexboxLayou ...

  4. Flutter布局----弹性布局 (Flex)

    弹性布局(Flex) 弹性布局允许子组件按照一定比例来分配父容器空间.弹性布局的概念在其它UI系统中也都存在,如H5中的弹性盒子布局,Android中的FlexboxLayout等.Flutter中的 ...

  5. 淘宝弹性布局方案lib-flexible实践

    2个月前,写过一篇文章<从网易与淘宝的font-size思考前端设计稿与工作流>总结过一些移动web中有关手机适配的一些思路,当时也是因为工作的关系分析了下网易跟淘宝的移动页面,最后才有那 ...

  6. Flex弹性布局在移动设备上的应用

    引文 首先,我们有表格布局.当不考虑语义并且利用一些适当的嵌套和其他技巧,我们可以用table建立具有一定功能的布局. 然后是现在大多数人都在使用的浮动布局.我们可以使用任何我们想用的元素,但浮动并不 ...

  7. 弹性布局详解——5个div让你学会弹性布局

      前  言 JRedu 在网页制作过程中,布局是我们最重要的一个环节.可以说布局的好坏直接影响到整个网页的成败!布局成,则事半功倍:布局败,则事倍功半. 随着移动互联的到来,响应式网站风靡.这也就兴 ...

  8. 弹性布局flex

    前几天写过怪异盒子布局,以前在项目中用到弹性布局flex这个属性,当时没深入研究,这里各种查阅各种测试,把这个属性记录下 以免忘记, 弹性布局:是提供一种更加有效的方式来对一个容器中的条目进行排列.对 ...

  9. 前端入门5-CSS弹性布局flex

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 声明 本系列文章内容全部梳理自以下四个来源: <HTML5权威指南> <JavaScript权威指南> MD ...

随机推荐

  1. numpy中的norm用法

    np.linalg.norm() computes the norm of a NumPy array according to an order, ord, which specifies the ...

  2. 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 虚 ...

  3. Elasticsearch基础教程分享

    基础及相关资料 首先我们先了解一下什么是Elastisearch,Elasticsearch(简称es)是一个基于Lucene库的搜索引擎.它提供了一个分布式.支持多租户的全文搜索引擎,具有HTTP  ...

  4. netty入坑第一步:了解netty和编写简单的Echo服务器和客户端

    早期java API通过原生socket产生所谓的"blocking",大致过程是这样 这种的特点是每次只能处理一个请求,如果要实现多个请求并行,就还要分配一个新的线程来给每个客户 ...

  5. 微信公众平台开发——为何不能在网页调用微信jsapi?

    说到这问题,相信大部分程序员老手都会轻蔑一笑,当然是跨域导致的啊!但是为了一些小白,我觉得还是很有必要再说一次的. 首先介绍什么是跨域,由于浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本( ...

  6. Zookeeper-watcher机制源码分析(一)

    Watcher的基本流程 ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:客户端注册 Watcher.服务器处理 Watcher 和客户端回调 Watcher 客户端注册wat ...

  7. 动态dp初探

    动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...

  8. tensorflow 1.0 学习:模型的保存与恢复(Saver)

    将训练好的模型参数保存起来,以便以后进行验证或测试,这是我们经常要做的事情.tf里面提供模型保存的是tf.train.Saver()模块. 模型保存,先要创建一个Saver对象:如 saver=tf. ...

  9. Elasticsearch基本概念及核心配置文件详解

    Elasticsearch5.X,下列的是Elasticsearch2.X系类配置,其实很多配置都是相互兼容的 1. 配置文件 config/elasticsearch.yml 主配置文件 confi ...

  10. ARM 处理器寻址方式之间接寻址的几种表达

    我们以 LDR 指令为例来分别举例分析. LDR 指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据送到目的寄存器 ...