Android彈性布局(FlexboxLayout)

Flexbox簡介

flexbox是屬于CSS的一種布局方案硫椰,可以簡單蓖救、完整竭贩、響應(yīng)式的實現(xiàn)各種頁面布局瑞躺。谷歌將其引入以提高復(fù)雜布局的能力敷搪。
源碼傳送門

Flexbox的布局和相關(guān)名稱


上圖模型中包含以下概念

  1. flex container 父容器,用來包含子元素隘蝎,對應(yīng)于FlexboxLayout類。
  2. flex item 子元素襟企,父容器直接包裹的元素嘱么。
  3. main axis 主軸,子元素通過主軸來排列顽悼,如上圖是從左往右曼振。
  4. corss axis 副軸几迄,垂直于主軸的第二個軸
  5. main start,main end 父容器中主軸開始和結(jié)束的邊界,子元素從main start往main end的方向排列(如果主軸是水平冰评,起點在左端映胁,main start,main end 用來控制子元素從左向右排列)
  6. cross start,corss end 父容器中副軸開始和結(jié)束的邊界。子元素從cross start往cross end方向排列(如果主軸是水平的甲雅,那么副軸就是垂直的解孙,假設(shè)如上圖,cross start 在上抛人,cross end 在下弛姜,那么子元素就是從上往下排列)

Flexbox 布局示例

<com.google.android.flexbox.FlexboxLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:flexWrap="wrap"
    app:alignItems="stretch"
    app:alignContent="stretch" >

    <TextView
        android:id="@+id/textview1"
        android:layout_width="120dp"
        android:layout_height="80dp"
        app:layout_flexBasisPercent="50%"
        />

    <TextView
        android:id="@+id/textview2"
        android:layout_width="80dp"
        android:layout_height="80dp"
        app:layout_alignSelf="center"
        />

    <TextView
        android:id="@+id/textview3"
        android:layout_width="160dp"
        android:layout_height="80dp"
        app:layout_alignSelf="flex_end"
        />
</com.google.android.flexbox.FlexboxLayout>

或者代碼

FlexboxLayout flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);
flexboxLayout.setFlexDirection(FlexboxLayout.FLEX_DIRECTION_COLUMN);

View view = flexboxLayout.getChildAt(0);
FlexboxLayout.LayoutParams lp = (FlexboxLayout.LayoutParams) view.getLayoutParams();
lp.order = -1;
lp.flexGrow = 2;
view.setLayoutParams(lp);

屬性介紹

Contatiner的屬性

  1. flexDirection:子元素的排列方向,決定主軸和副軸的方向妖枚,有以下四個值廷臼,文字太雞肋,直接看圖結(jié)合demo一目了然绝页。
  • row (default)


  • row_reverse


  • column


  • column_reverse


  1. flexWrap:控制單行和多行荠商,以及副軸的方向
  • nowrap (default) 不換行
  • wrap 換行
  • wrap_reverse 副軸方向置反
  1. justifyContent 控制沿主軸對齊
  • flex-start(default):左對齊
  • flex-end:右對齊
  • center: 居中
  • space-between:兩端對齊,項目之間的間隔都相等续誉。
  • space-around:每個項目兩側(cè)的間隔相等莱没。所以,項目之間的間隔比項目與邊框的間隔大一倍屈芜。
  1. alignItems 控制沿副軸對齊(單行起作用)
  • stretch(default):如果項目未設(shè)置高度或設(shè)為auto郊愧,將占滿整個容器的高度。
  • flex-start:交叉軸的起點對齊井佑。
  • flex-end:交叉軸的終點對齊属铁。
  • center:交叉軸的中點對齊。
  • baseline: 項目的第一行文字的基線對齊躬翁。
  1. alignContent :控制沿副軸對齊(多行起作用)
  • stretch(default):軸線占滿整個交叉軸焦蘑。
  • flex-start:與交叉軸的起點對齊。
  • flex-end:與交叉軸的終點對齊盒发。
  • center:與交叉軸的中點對齊例嘱。
  • space-between:與交叉軸兩端對齊,軸線之間的間隔平均分布宁舰。
  • space-around:每根軸線兩側(cè)的間隔都相等拼卵。所以,軸線之間的間隔比軸線與邊框的間隔大一倍蛮艰。

子元素的屬性

  1. layout_order: 控制子元素布局的順序腋腮,默認值為1,順序為XML中元素的順序
  2. layout_flexGrow 類似于weight。
  3. layout_flexShrink 空間不足時即寡,子元素縮小徊哑,如果為0,不變化
  4. layout_alignSelf 允許單個元素有不一樣的對齊方式聪富,會覆蓋align-item,除auto外莺丑,其他取值都和align-item的含義一致。
  • auto (default) 繼承父元素的align-item
  • flex_start
  • flex_end
  • center
  • baseline
  • stretch
  1. layout_flexBasisPercent 只能為百分比的值墩蔓,只有父元素是MeasureSpec.EXACTLY的模式時才有效梢莽。

與傳統(tǒng)CSS彈性布局不同之處

  1. 沒有flex-flow屬性 :因為沒必要
  2. 沒有flex屬性:同樣沒必要
  3. layout_flexBasisPercent 替代了flexBasis。如果子元素寬高確定了钢拧,可以指定具體值或百分比蟹漓,如果是包裹內(nèi)容,那只能是百分比
  4. 不能確定min-width和min-height:因為谷歌還沒實現(xiàn)

相關(guān)鏈接:
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
https://github.com/google/flexbox-layout/wiki
https://blog.stylingandroid.com/flexboxlayout-part-1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末源内,一起剝皮案震驚了整個濱河市葡粒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膜钓,老刑警劉巖嗽交,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颂斜,居然都是意外死亡夫壁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門沃疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒让,“玉大人,你說我怎么就攤上這事司蔬∫厍眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵俊啼,是天一觀的道長肺缕。 經(jīng)常有香客問我,道長授帕,這世上最難降的妖魔是什么同木? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮跛十,結(jié)果婚禮上彤路,老公的妹妹穿的比我還像新娘。我一直安慰自己芥映,他們只是感情好洲尊,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布缝裤。 她就那樣靜靜地躺著,像睡著了一般颊郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎苗,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天姆吭,我揣著相機與錄音,去河邊找鬼唁盏。 笑死内狸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厘擂。 我是一名探鬼主播昆淡,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刽严!你這毒婦竟也來了昂灵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舞萄,失蹤者是張志新(化名)和其女友劉穎眨补,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒脓,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡撑螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崎弃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甘晤。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饲做,靈堂內(nèi)的尸體忽然破棺而出线婚,到底是詐尸還是另有隱情,我是刑警寧澤艇炎,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布酌伊,位于F島的核電站,受9級特大地震影響缀踪,放射性物質(zhì)發(fā)生泄漏居砖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一驴娃、第九天 我趴在偏房一處隱蔽的房頂上張望奏候。 院中可真熱鬧,春花似錦唇敞、人聲如沸蔗草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咒精。三九已至镶柱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間模叙,已是汗流浹背歇拆。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留范咨,地道東北人故觅。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像渠啊,于是被迫代替她去往敵國和親输吏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容