Android FlexboxLayout 布局详解

栏目: Android · 发布时间: 5年前

内容简介:本篇文章demo源码地址:

FlexboxLayout16Google I/O 上开源的一个布局控件,使得 Android 里的 CSS Flexible Layout 模块也能拥有同样强大的功能。同时还发布了强大的 ConstraintLayout ,感兴趣的同学可以去看看 Android ConstraintLayout 详解。 FlexboxLayout 可以理解为高级的 LinearLayout ,因为这两个布局都将其子视图按序排列。二者之间的重要差异在于 FlexboxLayout 具有 换行 的特性。同时 FlexboxLayout 还为 RecycleView 提供了管理器 FlexboxLayoutManager ,使得 FlexboxLayout 更加强大了。

FlexboxLayout 项目开源地址: flexbox-layout

本篇文章demo源码地址: FlexboxLayoutDemo

导入依赖

dependencies {
    //FlexboxLayout
    implementation 'com.google.android:flexbox:1.0.0'
}
复制代码

注意:从1.1.0开始,这个库将与AndroidX一起使用。如果您使用1.1.0或以上版本,请迁移到AndroidX。 如果您还没有迁移到AndroidX,请使用1.0.0。

示例

XML布局文件

<com.google.android.flexbox.FlexboxLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flexbox_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textview1"
        android:layout_width="120dp"
        android:layout_height="20dp"
        android:layout_margin="2dp"
        android:background="#43eeff"
        android:gravity="center"
        android:text="1"/>

    <TextView
        android:id="@+id/textview2"
        android:layout_width="120dp"
        android:layout_height="60dp"
        android:layout_margin="2dp"
        android:background="#ef3344"
        android:gravity="center"
        android:text="2"/>

    <TextView
        android:id="@+id/textview3"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:layout_margin="2dp"
        android:background="#ee998f"
        android:gravity="center"
        android:text="3"/>

    <TextView
        android:id="@+id/textview4"
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:layout_margin="2dp"
        android:background="#eeff22"
        android:gravity="center"
        android:text="4"/>

    <TextView
        android:id="@+id/textview5"
        android:layout_width="120dp"
        android:layout_height="80dp"
        android:layout_margin="2dp"
        android:background="#3322ff"
        android:gravity="center"
        android:text="5"/>

</com.google.android.flexbox.FlexboxLayout>
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

我们可以看到并没有换行,和我们使用 LinearLayout 并没有区别,接下来我们看下 FlexboxLayout 的一些常用属性。

FlexboxLayout 常用属性

flexDirection

flexDirection 属性决定主轴项目排列方向。类似 LinearLayoutverticalhorizontal ,但是 FlexboxLayout 更加强大,不仅支持横向和纵向还可以设置不同的排列的起点。

row
row_reverse
column
column_reverse

下面我们在xml中添加 flexDirection 属性,并设置起点在下端:

app:flexDirection="column_reverse"
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

可以看到项目是从底部开始由下而上排列的。

flexWrap

默认 FlexboxLayoutLinearLayout 一样是不带换行属性的,但是 flexWrap 属性可以支持换行排列。这就是 FlexboxLayout 方便的地方了。换行方式有两种,一种是 按项目排列方向换行 ,一种是 反方向换行

  • nowrap (默认):不换行。

  • wrap :按正常方向换行。

  • wrap_reverse :按反方向换行。

下面我们在xml中添加 flexWrap 属性,按照正常方向换行:

app:flexWrap="wrap"
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

justifyContent

justifyContent 属性定义了项目在主轴上的对齐方式。

  • flex_start (默认值):左对齐。

  • flex_end :右对齐。

  • center : 居中。

  • space_between :两端对齐,项目之间的间隔都相等。

  • space_around :每个项目两侧的间隔相等。项目之间的间隔比项目与边框的间隔大一倍。

下面我们在xml中添加 justifyContent 属性,设置右对齐:

app:justifyContent="flex_end"
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

如果需要在项目的排列方向上均分剩余的空间怎么办呢?很简单 space_around 属性就是这样的,效果如下图

Android FlexboxLayout 布局详解

alignItems

alignItems 属性定义项目在副轴轴上如何对齐,我们通过一张图来了解这个属性比较直观一点。

  • flex_start :交叉轴的起点对齐。

  • flex_end :交叉轴的终点对齐。

  • center :交叉轴的中点对齐。

  • baseline : 项目的第一行文字的基线对齐。

  • stretch (默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

Android FlexboxLayout 布局详解

这也是为什么我们的每一个项目的高度都是不相同的,但是可以看到前面每个项目的高度都是一样的,因为默认属性 stretch 让每个项目的高度设置为了填满容器的高度(这里的高度是指同一轴上的最高高度) 现在我们设置对齐方式为中心对齐,添加属性:

app:alignItems="center"
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

可以看到是根据每个项目的中心对齐,这里单独说一下 baseline 属性,熟悉 ConstraintLayout 的同学应该比较好理解这个属性,其实就是按照项目内的文本线来对齐项目。效果如下

Android FlexboxLayout 布局详解

可以看到项目对齐是按照项目内的文本基线来对齐的。很好理解!需要注意的是项目中如果有的没有文本基线,那么默认他的基线就是左上角也就是起点左右位置。

Android FlexboxLayout 布局详解

alignContent

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

  • flex_start :与交叉轴的起点对齐。

  • flex_end :与交叉轴的终点对齐。

  • center :与交叉轴的中点对齐。

  • space_between :与交叉轴两端对齐,轴线之间的间隔平均分布。

  • space_around :每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。

  • stretch (默认值):轴线占满整个交叉轴。

alignContentjustifyContent 其实里面的属性值都是一样的 ,一个是 设置主轴的对齐方式 ,一个是 设置多个轴的对齐方式 ,通俗的讲可以理解为比如是项目是水平换行, justifyContent 就是设置垂直方向的对齐方式,如果项目是垂直方向对齐方式,那么 justifyContent 就是设置水平方向的对齐方式。现在我们想让每个项目距离上右下左的距离是一样的,需要把 alignContentjustifyContent 都设置为 space_around 就可以了。

app:alignContent="space_around"
app:justifyContent="space_around"
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

showDividerHorizontal

showDividerHorizontal 控制显示水平方向的分割线,值为 none | beginning | middle | end 其中的一个或者多个。

dividerDrawableHorizontal

dividerDrawableHorizontal 设置Flex 轴线之间水平方向的分割线。

showDividerVertical

showDividerVertical 控制显示垂直方向的分割线,值为 none | beginning | middle | end 其中的一个或者多个。

dividerDrawableVertical

dividerDrawableVertical 设置子元素垂直方向的分割线。

showDivider

showDivider 控制显示水平和垂直方向的分割线,值为 none | beginning | middle | end 其中的一个或者多个。

dividerDrawable

dividerDrawable 设置水平和垂直方向的分割线,但是注意,如果同时和其他属性使用,比如为 Flex 轴、子元素设置了 justifyContent="space_around"alignContent="space_between" 等等。可能会看到意料不到的空间,因此应该避免和这些值同时使用。

子元素属性

除以上之外, FlexboxLayout 不仅有自身的属性,还可以设置子元素的属性。这也是 FlexboxLayout 能完成聪明布局的原因之一。

layout_order

默认情况下子元素的排列方式按照文档流的顺序依次排序,而 order 属性可以控制排列的顺序,负值在前,正值在后,按照从小到大的顺序依次排列。简而言之就是你可以定义子元素的排列顺序。

我们给子元素加上 order 属性并且自定义他们的顺序。

Android FlexboxLayout 布局详解

layout_flexGrow

layout_flexGrow 属性定义项目的放大比例,默认为 0 ,即如果存在剩余空间,也不放大。其实就是 LinearLayout 中的 weight 属性,如果所有项目的 layout_flexGrow 属性都为 1 ,则它们将 等分剩余空间 。如果一个项目的 layout_flexGrow 属性为 2 ,其他项目都为 1 ,则 前者占据的剩余空间将比其他项多一倍

layout_flexShrink

layout_flexShrink 属性定义了项目的缩小比例,默认为 1 ,即如果空间不足,该项目将缩小(设置了换行则无效)。如果所有项目的 layout_flexShrink 属性都为 1 ,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink 属性为 0 ,其他项目都为 1 ,则空间不足时,前者不缩小。负值对该属性无效。

layout_alignSelf

layout_alignSelf 属性允许单个子元素有与其他子元素不一样的对齐方式,可覆盖 alignItems 属性。默认值为 auto ,表示继承父元素的 alignItems 属性,如果没有父元素,则等同于 stretch

  • auto (default)

  • flex_start

  • flex_end

  • center

  • baseline

  • stretch

该属性可能取6个值,除了 auto ,其他都与 align_items 属性完全一致,我们设置 alignItemsflex_start 属性,其中一个子元素设置 layout_alignSelf 属性为 baseline

baseline 的基线是第一个元素的 baseline 基线。

layout_flexBasisPercent

layout_flexBasisPercent 属性定义了在分配多余空间之前,子元素占据的主轴空间的百分比。它的默认值为 auto ,即子元素的本来大小。

我们设置第一个和第三个都占据的主轴空间的80%,给子元素添加属性

app:layout_flexBasisPercent
复制代码
Android FlexboxLayout 布局详解

FlexboxLayout 的属性基本讲解完了,如果一脸懵逼那么请 看第二遍。 FlexboxLayout 能帮你完成各种你需要的布局,可谓 LinearLayout 的加强版。比如我们需要做一个类似于Tag标签的布局,那么 FlexboxLayout 能帮你轻轻松松实现。这里需要用到 FlexboxLayoutManager ,也就是 FlexboxLayoutRecycleView 提供的布局管理器 布局中添加RecycleView。

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
复制代码

代码中对RecycleView添加布局管理器,并设置 FlexboxLayout 的主属性

RecyclerView recyclerView = findViewById(R.id.recyclerView);
    FlexboxLayoutManager flexboxLayoutManager = new FlexboxLayoutManager(this);
    flexboxLayoutManager.setFlexWrap(FlexWrap.WRAP);
    flexboxLayoutManager.setFlexDirection(FlexDirection.ROW);
    flexboxLayoutManager.setAlignItems(AlignItems.STRETCH);
    flexboxLayoutManager.setJustifyContent(JustifyContent.FLEX_START);
    recyclerView.setLayoutManager(flexboxLayoutManager);
复制代码

运行后的效果如下图:

Android FlexboxLayout 布局详解

轻轻松松实现了Tag标签的效果,是不是很简单,同样的方式我们还可以实现一个图片流布局。

FlexboxLayout 的使用现在已经讲解完了,相信各位对这个控件的强大已经有所了解了,不妨亲自动手感受下这个控件的强大。Google开放了越来越多的控件和开发辅助工具,对于开发者的我们来说当然是好的。当然我们自己也要保持一颗热爱学习的心,不要抗拒新的东西,不断学习 充实自己! 知行合一。

原文地址: www.jianshu.com/p/b3a9c4a99…


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Security, Privacy and Commerce, 2nd Edition

Web Security, Privacy and Commerce, 2nd Edition

Simson Garfinkel / O'Reilly Media / 2002-01-15 / USD 44.95

Since the first edition of this classic reference was published, World Wide Web use has exploded and e-commerce has become a daily part of business and personal life. As Web use has grown, so have ......一起来看看 《Web Security, Privacy and Commerce, 2nd Edition》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具