Android开发经验谈Android开发GitHub上有趣的资源

来自CSS的Flexbox for Android

2016-06-24  本文已影响248人  皮球二二

今天给大家介绍一个新的控件,这个是谷歌在3个月之前的一天突然在GitHub上发布的。他的介绍言简意赅Flexbox for Android。Flexbox 的概念是从CSS Flexible Box Layout 模块中得到相应的灵感,然后把它的理念搬到Android上面来的。以我现在的水平来看,我觉得他就是为了方便我们实现FlowLayout的功能,以及在某种程度上替代GridView与GridLayout而生,至于我说的对不对,请大家多多给点意见

基本概念

axis

将上图模型中包含的重要概念明确下
main axis 主轴,子元素通过主轴来排列,如上图是从左往右。
corss axis 侧轴就是与主轴垂直的轴
这2个概念是后续官方描述中经常提到的概念

加载

加载过程没有什么不同,compile下就好了

dependencies {
    compile 'com.google.android:flexbox:0.2.2'
}

加载完成了我们就可以使用了,如果你想看看动图特效,可以直接去Github上直接查看

父元素属性

先上布局文件,大致看看怎么写的

<com.google.android.flexbox.FlexboxLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    app:flexDirection="row"
    app:flexWrap="wrap"
    app:justifyContent="flex_start"
    app:alignItems="flex_start"
    app:alignContent="flex_start"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="Hello1Hello1Hello1Hello1Hello1Hello1"
        android:layout_width="100dip"
        android:layout_height="70dip"
        android:background="@android:color/holo_red_light"
        android:gravity="center"/>
    <TextView
        android:text="Hello2"
        android:layout_width="100dip"
        android:layout_height="70dip"
        android:background="@android:color/holo_blue_bright"
        android:gravity="center"/>
    <TextView
        android:text="Hello3Hello3Hello3Hello3Hello3"
        android:layout_width="100dip"
        android:layout_height="70dip"
        android:background="@android:color/holo_green_light"
        android:gravity="center"/>
    <TextView
        android:text="Hello4Hello4"
        android:layout_width="100dip"
        android:layout_height="70dip"
        android:background="@android:color/holo_purple"
        android:gravity="center"/>
    <TextView
        android:text="Hello5Hello5Hello5"
        android:layout_width="100dip"
        android:layout_height="70dip"
        android:background="@android:color/holo_orange_light"
        android:gravity="center"/>
</com.google.android.flexbox.FlexboxLayout>

主要的有这5个属性

app:flexDirection
app:flexWrap
app:justifyContent
app:alignItems
app:alignContent
<attr name="flexDirection">
    <enum name="row" value="0"/>
    <enum name="row_reverse" value="1"/>
    <enum name="column" value="2"/>
    <enum name="column_reverse" value="3"/>
</attr>

row: 水平方向由左往右排列
row_reverse: 这是反向的,水平方向由右往左排列
column: 垂直方向由上往下排列
column_reverse: 这也是反向的,垂直方向由下往下上排列

来看看效果是什么样的。注意每一个Item上面的文字,以备于同后续做对比

row row_reverse column column_reverse
<attr name="flexWrap">
    <enum name="nowrap" value="0"/>
    <enum name="wrap" value="1"/>
    <enum name="wrap_reverse" value="2"/>
</attr>

nowrap: 不换行排
wrap: 换行排
wrap_reverse: 反方向换行排

nowrap wrap wrap_reverse
<attr name="justifyContent">
    <enum name="flex_start" value="0"/>
    <enum name="flex_end" value="1"/>
    <enum name="center" value="2"/>
    <enum name="space_between" value="3"/>
    <enum name="space_around" value="4"/>
</attr>

flex_start: 与起始位置对齐(比如你设置的flexDirection是row,那么起始位置就是左边,采用左对齐)
flex_end: 与终止位置对齐(比如你设置的flexDirection是row,那么终止位置就是右边,采用右对齐)
center: 居中对齐(这个不是在ViewGroup中间的意思,仅仅是在他位置的主轴方向居中)
space_between: 两端对齐,Item之间的间隔都相等
space_around: 这个不知道怎么翻译了,效果就是每个Item之间的间隔相等

flex_start flex_end center space_between space_around
<attr name="alignItems">
    <enum name="flex_start" value="0"/>
    <enum name="flex_end" value="1"/>
    <enum name="center" value="2"/>
    <enum name="baseline" value="3"/>
    <enum name="stretch" value="4"/>
</attr>

flex_start: 与起始位置对齐(比如你设置的flexDirection是row,那么起始位置就是左边,采用上对齐)
flex_end: 与终止位置对齐(比如你设置的flexDirection是row,那么终止位置就是右边,采用下对齐)
center: 居中对齐(这个不是在ViewGroup中间的意思,仅仅是在他位置的侧轴方向居中)
baseline: 与项目的第一行文字的基线对齐
stretch: 如果项目未设置高度或设为auto,那么高度将占满整个容器

flex_start flex_end center baseline stretch
<attr name="alignContent">
    <enum name="flex_start" value="0"/>
    <enum name="flex_end" value="1"/>
    <enum name="center" value="2"/>
    <enum name="space_between" value="3"/>
    <enum name="space_around" value="4"/>
    <enum name="stretch" value="5"/>
</attr>

flex_start: 与起始位置对齐(比如你设置的flexDirection是row,那么起始位置就是左边,采用上对齐)
flex_end: 与终止位置对齐(比如你设置的flexDirection是row,那么终止位置就是右边,采用下对齐)
center: 居中对齐(这个不是在ViewGroup中间的意思,仅仅是在他位置的侧轴方向居中)
space_between: 两端对齐,每一个轴之间的间隔都相等
space_around: 这个不知道怎么翻译了,效果就是每个轴之间的间隔相等
stretch: 如果项目未设置高度或设为auto,那么高度将占满整个容器

flex_start flex_end center space_between space_around stretch

子元素属性

对父元素属性介绍完毕之后,我们再来说说子元素

layout_order

到第一个来了,优先级最高

layout_flexGrow

占满了。

然后我又给1、3均加上layout_flexGrow="1"

layout_flexGrow

均分剩余空间了

我加了一个黑色的,大家可以与上图对比下,确实是等比缩小

flex_start flex_start

我现在将红色的第一个设置为0,红色部分恢复到之前的大小了,而其他几个元素都被压缩了


flex_start flex_start

如果数字越大,那么压缩比例就会越大,这里就不重复贴图了

layout_flexBasisPercent

占据一半空间了

<attr name="layout_alignSelf">
    <enum name="auto" value="-1"/>
    <enum name="flex_start" value="0"/>
    <enum name="flex_end" value="1"/>
    <enum name="center" value="2"/>
    <enum name="baseline" value="3"/>
    <enum name="stretch" value="4"/>
</attr>

除了这个auto属性值,其他都与alignItems一致

来看看具体效果,我们把第二个textview的高度设置成wrap_content,然后添加app:layout_alignSelf="flex_start"

layout_alignSelf

再换成app:layout_alignSelf="flex_end"属性

layout_alignSelf layout_wrapBefore

果断换行了

OK,今天的介绍就结束了,希望大家能够自己积极思考这个控件的使用场景,相信谷歌推出它一定有它的意义

主要参考文章

前端基础(二)--快速布局神器Flexbox布局
Android弹性布局(FlexboxLayout)

上一篇 下一篇

猜你喜欢

热点阅读