關于Google新的適配方式---FlexboxLayout


前言

工欲善其事必先利其器,學習FlexboxLayout之前,先看看它是用來干嘛的,都有哪些特性,了解之后,再來利用它。先放上項目地址--flexbox-layout的GitHub地址


正文

  • 概念
    Flexbox,簡單理解為彈性盒子,就是一個可伸縮的區域或者空間
    在GitHub上,給出的介紹是一個將CSS Flexible Box Layout Module的類似功能帶入Android的庫,關于CSS的Flexible Box,這里有一篇介紹比較詳細的文章 ,盡管具體語法不同,但是思想是想通的,可以參考。
    FlexboxLayout可以理解成一個高級版的LinearLayout,因為兩個布局都把子view按順序排列。兩者之間最大的差別在于FlexboxLayout具有換行的特性。

  • 引入
    穩定版本

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

開發測試版本 --包含了Recyclerview的集成

dependencies {
    compile 'com.google.android:flexbox:0.3.0-alpha3'
}

根據個人需求,選擇合適版本

  • 用法
  
    <com.google.android.flexbox.FlexboxLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:alignItems="flex_start">

        <TextView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@color/colorAccent" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:background="@color/blue" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="180dp"
            android:background="@color/little_pink_primary" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:background="@color/black" />

        <TextView
            android:layout_width="120dp"
            android:layout_height="100dp"
            android:background="@color/orange" />

        <TextView
            android:layout_width="100dp"
            android:layout_height="80dp"
            android:background="@color/side" />

        <TextView
            android:layout_width="80dp"
            android:layout_height="200dp"
            android:background="@color/reset_check" />
    </com.google.android.flexbox.FlexboxLayout>
布局.png

可以看到類似LinearLayout,子元素是依次排列,唯一設置了屬性就是app:alignItems="flex_start",那么FlexboxLayout都有哪些屬性,每個屬性的作用,需要我們一點點梳理,具體分為兩個方面,一方面是FlexboxLayout的屬性,另一方面是FlexboxLayout子元素的屬性

FlexboxLayout屬性

  • flexDirecition 子元素在主軸的排列方向
  • app:flexDirection="row" 默認值,水平方向,起點在左,從左到右。
  • app:flexDirection="row_reverse" 和row屬性相反,水平方向,從右到左,起點在右端。
  • app:flexDirection="column" 主軸是豎直方向,起點在上端,從上到下。
  • app:flexDirection="column_reverse" 和column相反,豎直方向,起點在下方從下到上

通過四張圖的對比,是明顯看出來各個屬性的作用的

row
row_reverse
column
column_reverse
  • alignItems 子元素在副軸的排列方向,例如:主軸水平方向--副軸豎直方向
  • stretch 默認值,如果子元素未設置高度或設為auto,將占滿整個父容器的高度
  • flex_start:頂端對齊
  • flex_end:底部對齊
  • center:居中對齊
  • baseline:子元素的第一行內容的基線對齊
    stretch
flex_start
flex_end
Paste_Image.png

根據圖能很明顯看出baseline的作用

baseline

  • flexWrap 默認 Flex不換行,更改flexWrap可以支持換行
  • nowrap不換行
  • wrap 換行
  • wrap_reverse 反向換行


    nowrap
wrap
wrap_reverse
  • justifyContent 元素在主軸的對齊方式
  • flex_start 默認,左對齊
  • flex_end 右對齊
    -center 居中對齊
  • space_around 相鄰元素兩側間隔相等,兩側元素和邊框的間隔是兩個元素間隔的一半
  • space-between 兩端對齊,相鄰兩元素間隔相等


    flex_start
flex_end
center
space_around
space-between
  • alignContent 存在多條副軸時,副軸軸線時的對齊方式,子元素只有一行時不起作用

  • stretch 默認值,充滿副軸的高度,只有副軸排列app:alignItems="stretch"時,app:alignContent="stretch"才會生效,即app:alignItems="stretch"且app:alignContent="stretch"


    alignContent="stretch"且app:alignItems="stretch"
  • flex_start 與交叉軸的起點對齊


    flex_start
  • flex_end 與交叉軸的終點對齊

flex_end
  • center:與交叉軸的中點對齊。
center
  • space_around 每根軸線兩側間隔相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍


    space_around
  • space_between 兩端對齊,軸線之間的間隔相等


    space_between
  • **showDividerHorizontal **
    控制顯示水平方向的分割線,值為none | beginning | middle | end其中的一個或者多個
  • **dividerDrawableHorizontal **
    設置Flex 軸線之間水平方向的分割線。
  • showDividerVertical
    控制顯示垂直方向的分割線,值為none | beginning | middle | end其中的一個或者多個。
  • dividerDrawableVertical
    設置子元素垂直方向的分割線。
  • showDivider
    控制顯示水平和垂直方向的分割線,值為none | beginning | middle | end其中的一個或者多個。
  • dividerDrawable
    設置水平和垂直方向的分割線,但是注意,如果同時和其他屬性使用,比如為 Flex 軸、子元素設置了justifyContent="space_around" 、alignContent="space_between" 等等。可能會看到意料不到的空間,因此應該避免和這些值同時使用。

FlexboxLayout子元素屬性

  • layout_order
    子元素默認是按照元素的位置先后排列的,但是layout_order的值可以控制元素的排列順序,按照數字的大小排列,例如將第三個元素layout_order 設置-1
第三個元素出現在第一個的位置
  • layout_flexGrow 元素放大比例,默認為0,類似于 LinearLayout 中的layout_weight屬性,根據比例等分,如果有一個子元素的 layout_flexGrow 是一個正值,那么會將全部剩余空間分配給這個Item,如果有多個Item這個屬性都為正值,那么剩余空間的分配按照layout_flexGrow定義的比例等分。

  • layout_flexShrink 子元素縮小比例,默認為1,當子元素多行時無效
    如果所有子元素的layout_flexShrink 值為1,空間不足時,都等比縮小,如果有一個為0,其他為1,空間不足時,為0的不縮小,負值無效。

  • layout_alignSelf 子元素的對齊方式, 允許單個子元素有與其他子元素不一樣的對齊方式,可覆蓋 alignItems 屬性。默認值為auto,表示繼承父元素的 alignItems 屬性,如果沒有父元素,則等同于stretch。

  • auto (default) 繼承父元素alignItems 屬性,父元素alignItems 屬性不存在則默認stretch

  • flex_start 同alignItems 的flex_start屬性

  • flex_end 同alignItems 的flex_end屬性

  • center 同alignItems 的cente屬性

  • baseline 同alignItems 的baseline屬性

  • stretch 同alignItems 的stretch屬性

  • layout_flexBasisPercent 子元素占父容器長度的百分比,覆蓋了子元素自身的layout_width或layout_height,前提是父容器的長度或者寬度設置了值,否則無效

layout_flexBasisPercent
  • **layout_minWidth / layout_minHeight ** 強制限定子元素的最小寬度或者最小高度,即使layout_flexShrink縮小比例,也會保證不小于子元素寬度或者高度的最小值

  • **layout_maxWidth / layout_maxHeight ** 強制限定子元素的最大寬度或者最大高度,即使layout_flexGrow放大比例,也會保證不大于子元素寬度或者高度的最大值

  • layout_wrapBefore 強制換行,即使父容器設置了flex_wrap=nowrap,依然將當前元素換到下一行的第一個元素顯示。

上面講到FlexboxLayout有兩個版本,內部測試版,添加了與Recyclerview的結合。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容