Constraint Layout 2.0 新特性 - Flow 流式布局

Constraint Layout 是最受歡迎的 Jetpack 庫(kù)之一爽柒。

Flow是什么

Flow 是一種新的虛擬布局吴菠,它專門用來構(gòu)建鏈?zhǔn)脚虐嫘Ч?/strong>,當(dāng)出現(xiàn)空間不足的情況時(shí)浩村,它能夠自動(dòng)換行做葵,甚至是自動(dòng)延展到屏幕的另一區(qū)域。

Flow應(yīng)用場(chǎng)景

當(dāng)您需要對(duì)多個(gè)元素進(jìn)行鏈?zhǔn)讲季?/strong>穴亏,但不確定在運(yùn)行時(shí)布局空間的實(shí)際大小是多少蜂挪,那么 Flow 對(duì)您來說就非常有用。您可以使用 Flow 來實(shí)現(xiàn)讓布局隨著應(yīng)用屏幕尺寸的變化 (比如設(shè)備發(fā)生旋轉(zhuǎn)后出現(xiàn)的屏幕寬度變化) 而動(dòng)態(tài)地進(jìn)行自適應(yīng)嗓化。

Flow 是一種虛擬布局棠涮。在 Constraint Layout 中,虛擬布局 (Virtual layouts) 作為 virtual view group 的角色參與約束和布局中刺覆,但是它們并不會(huì)作為視圖添加到視圖層級(jí)結(jié)構(gòu)中严肪,而是僅僅引用其它視圖來輔助它們?cè)诓季窒到y(tǒng)中完成各自的布局功能。

在 Constraint Layout 2.0 中谦屑,您可以用 Flow 標(biāo)簽來使用這一功能驳糯。Flow 會(huì)通過您傳遞的 constraint_referenced_ids 參數(shù)來獲取到要引用的所有視圖,然后根據(jù)這些視圖創(chuàng)建一個(gè)虛擬的 virtual view group氢橙,再對(duì)這些視圖進(jìn)行鏈?zhǔn)讲季帧?/p>

Flow屬性

wrapMode

Flow 中最重要的一個(gè)配置選項(xiàng)是 wrapMode酝枢,它可以決定在內(nèi)容溢出 (或出現(xiàn)換行) 時(shí)的布局行為。

您可以對(duì) wrapMode 指定三種模式:

  • none – 所有引用的視圖以一條鏈的方式進(jìn)行布局悍手,如果內(nèi)容溢出則溢出內(nèi)容不可見帘睦;
  • chain – 當(dāng)出現(xiàn)溢出時(shí)袍患,溢出的內(nèi)容會(huì)自動(dòng)換行,以新的一條鏈的方式進(jìn)行布局竣付;
  • align – 同 chain 類似诡延,但是不以行而是以列的方式進(jìn)行布局。

布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <androidx.constraintlayout.helper.widget.Flow
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:constraint_referenced_ids="card1,card2,card3,card4"
        app:flow_horizontalGap="12dp"
        app:flow_verticalGap="12dp"
        app:flow_wrapMode="chain"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/purple_200"
        app:cardCornerRadius="8dp">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="The Card 1 Ha" />
    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/purple_200"
        app:cardCornerRadius="8dp">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="Card 2" />
    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/purple_200"
        app:cardCornerRadius="8dp">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="The Card 3" />
    </com.google.android.material.card.MaterialCardView>

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/purple_200"
        app:cardCornerRadius="8dp">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="Card 4" />
    </com.google.android.material.card.MaterialCardView>

</androidx.constraintlayout.widget.ConstraintLayout>

app:flow_wrapMode="chain"如圖1:

圖1.png

app:flow_wrapMode="aligned"古胆,對(duì)齊展示肆良,此對(duì)齊是絕對(duì)對(duì)齊,如果視圖大小不一逸绎,也會(huì)上下對(duì)齊惹恃,如圖2:

圖2.png

行間距

  • app:flow_horizontalGap:橫向行間距
  • app:flow_verticalGap:縱向行間距

orientation 水平or垂直流式

以上的圖都是默認(rèn)android:orientation="horizontal"的流式布局,而android:orientation="vertical"的樣式如圖3:

圖3.png

對(duì)齊

除了app:flow_wrapMode="aligned"的絕對(duì)對(duì)齊之外桶良,F(xiàn)low還有幾種對(duì)齊方式:

app:flow_verticalAlign:值有top座舍,bottomcenter陨帆,baseline曲秉。字面意思是約束所有垂直位置,與horizontal的語義正好相反疲牵。android:orientation="horizontal"承二,或者不配置時(shí)才生效。

舉例纲爸,top就是頂部對(duì)齊亥鸠,如圖4:


圖4.png

app:flow_horizontalAlign:值有start,end识啦,center负蚊。字面意思是約束所有水平位置。orientation為vertical颓哮,或者不配置時(shí)才生效家妆。

舉例,end就是尾部對(duì)齊冕茅,如圖5:


圖5.png

鏈約束

ConstraintLayout所有的鏈約束都是三個(gè)值:packed伤极,spreadspread_inside姨伤。spread是默認(rèn)值哨坪。

Flow相關(guān)鏈約束:

  • app:flow_horizontalStyle:約束所有水平鏈樣式
  • app:flow_verticalStyle:約束所有垂直鏈樣式
  • flow_firstHorizontalStyle:約束水平樣式首行鏈樣式
  • flow_firstVerticalStyle:約束垂直樣式首行鏈樣式
  • flow_lastHorizontalStyle:約束水平樣式尾行鏈樣式
  • flow_lastVerticalStyle:約束垂直樣式尾行鏈樣式

app:flow_verticalStyle="packed", 如圖6:

圖6.png

app:flow_firstVerticalStyle="packed", 如圖7:

圖7.png

flow_maxElementsWrap

類似GridLayoutManager類似乍楚,可以配置每行或者每列最多是視圖当编,例如配置:
app:flow_maxElementsWrap="3",如圖8:

圖8.png

練習(xí)Demo:https://github.com/ooxiaoyan/ConstraintLayoutTest

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徒溪,一起剝皮案震驚了整個(gè)濱河市凌箕,隨后出現(xiàn)的幾起案子拧篮,更是在濱河造成了極大的恐慌,老刑警劉巖牵舱,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缺虐,居然都是意外死亡芜壁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門高氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慧妄,“玉大人,你說我怎么就攤上這事剪芍∪停” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵罪裹,是天一觀的道長(zhǎng)饱普。 經(jīng)常有香客問我,道長(zhǎng)状共,這世上最難降的妖魔是什么套耕? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮峡继,結(jié)果婚禮上冯袍,老公的妹妹穿的比我還像新娘。我一直安慰自己碾牌,他們只是感情好康愤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舶吗,像睡著了一般征冷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裤翩,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天资盅,我揣著相機(jī)與錄音,去河邊找鬼踊赠。 笑死呵扛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筐带。 我是一名探鬼主播今穿,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伦籍!你這毒婦竟也來了蓝晒?” 一聲冷哼從身側(cè)響起腮出,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芝薇,沒想到半個(gè)月后胚嘲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛二,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年馋劈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晾嘶。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妓雾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垒迂,到底是詐尸還是另有隱情械姻,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布机断,位于F島的核電站楷拳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毫缆。R本人自食惡果不足惜唯竹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苦丁。 院中可真熱鬧浸颓,春花似錦、人聲如沸旺拉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾狗。三九已至晋涣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沉桌,已是汗流浹背谢鹊。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留留凭,地道東北人佃扼。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔼夜,于是被迫代替她去往敵國(guó)和親兼耀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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