这篇文章主要参考了官方文档和阮老师的Flex 布局教程:语法篇javascript
github地址css
最近Google开源了一个叫flex-box的库,它的思路是参照的CSS的Flex布局设计的,因此属性基本都是和CSS上的Flex布局保持一致,但由于是两个不一样的平台,因此减小了几个不适用于Android的属性,新增了几个属性,具体咱们下面会说到。html
在了解Google开源的flex-box,我以为有必要先了解下CSS的Flex布局,这有助于咱们理解那些属性定义。关于这方面的知识,能够阅读这篇博客。下面咱们只是简要的了解下,具体属性咱们放到讲解Google的flex-box中去说明。java
//这段文字说明,来源于上面说到的博客
采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的全部子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫作main start,结束位置叫作main end;交叉轴的开始位置叫作cross start,结束位置叫作cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫作main size,占据的交叉轴空间叫作cross size。复制代码
注意:如下文中用到的flexbox-layout指的是Google开源的库,Flex指的是CSS中的Flex布局。android
首先咱们须要知道的是,flexbox-layout的基本概念和Flex是同样的,最外面的这层布局称为容器,在flexbox-layout指的是com.google.android.flexbox.FlexboxLayout
,里面的子元素称为项目。容器默认存在两条轴,其中水平(这里是就上面的概念图而言,由于主轴的方向是能够指定的)的这条轴称为主轴(我的理解,能够存在多条,具体缘由后面讲),垂直的这条称为交叉轴。其余属性好比start
,end
等等也是同样的,具体能够看上面的基本概念图。git
下面咱们着重讲下flexbox-layout支持的属性,由于它既支持容器属性,也支持项目属性,因此咱们分红两个篇幅来讲明。github
注意:如下属性设置的具体效果请参照说明文档和Demo,github地址ide
flexDirection布局
这个属性用于肯定主轴方向,可选的值有:flex
flexWrap
这个属性控制容器是单行仍是自动换行,以及主轴的方向,可选的值有:
关于wrap
和wrap-reverse
的区别:
justifyContent
这个属性控制项目在主轴上的对齐方式,可选的值有:
注意:具体的对齐方式与主轴的方向有关,下面的说明是基于默认值
关于space_between
和space_around
的样式以下:
alignItems
这个属性定义项目在交叉轴上的对齐方式,可选的值有:
注意:具体的对齐方式与主轴的方向有关
关于stretch
和baseline
的样式以下:
alignContent
这个属性控制容器的多条主轴的对齐方式,这也是咱们前面提到的主轴能够有多条,当flexWrap:wrap|wrapreverse
。可选的值有:
注意:只有一条主轴,该属性不起做用
这里须要注意区别下和alignItems
的区别,alignContent
是多条主轴基于交叉轴的对齐方式,然后者是项目基于交叉轴的对齐方式,一个是轴,一个是项目。
showDividerHorizontal
dividerDrawableHorizontal
showDividerVertical
dividerDrawableVertical
showDivider
dividerDrawable
这几个属性都是跟分隔符有关,具体用法能够看文档。
layout_order(integer)
这个属性能够改变项目的排列顺序,默认值为1
。
layout_flexGrow(float)
这个属性定义项目基于当前行的放大比例,默认值为0
。这个属性相似LinearLayout
中的layout_weight
属性,若是当前行只有一个项目的layout_flexGrow
为正值,则该项目将占满当前行剩余的空间,下面的效果是三个相同大小的项目,其中一个layout_flexGrow
为正值的效果:
若是存在多个layout_flexGrow
为正值的状况,则这几个项目则会按设置的值为比例占用当前行剩余的空间,下面的效果是三个相同大小的项目,其中两个项目设置layout_flexGrow:1
的效果:
layout_flexShrink (float)
这个属性定义了项目的缩小比例,默认为1
,即若是当前行空间不足,该项目缩小的方式。
若是全部项目的layout_flexShrink
属性都为1,当空间不足时,都将等比例缩小。若是一个项目的layout_flexShrink
属性为0,其余项目都为1,则空间不足时,前者不缩小。
我的理解,注意:要设置flexWrap:nowrap
为单行
layout_alignSelf
该属性容许单个项目与其余项目不同的基于交叉轴的对齐方式。默认值为auto
,即按照容器的alignItems
属性,设置其余值,则会覆盖容器的值,可选的值:
layout_flexBasisPercent (fraction)
这个属性设置项目长度相对于容器的百分比,若是设置了这个值,则从layout_width
或layout_height
指定的长度会被覆盖,须要注意的是,这个属性只在容器长度肯定的状况下有效,即MeasureSpec.EXACTLY
。默认值为-1
,表示不设置。
layout_minWidth / layout_minHeight (dimension)
layout_maxWidth / layout_maxHeight (dimension)
这些属性设置对项目的最大最小限制
layout_wrapBefore (boolean)
这个属性默认值为false
,若是设置为true
,则该项目将强制成为当前行的第一个项目,会忽略flex_wrap:nowrap
设置。
底部按钮
流式布局
TODO