Google控件FlexboxLayout實現(xiàn)流式布局

github地址(歡迎下載完整Demo)
https://github.com/zhouxu88/FlexboxLayout

效果圖

簡書首頁.jpg
仿簡書.jpg
簡介:

大家都知道,在以往如果我們想要實現(xiàn)上面這種流式布局,只能去自定義View喇辽,繼承ViewGroup來做摘符,還是比較復雜的爱致。但是睁宰,去年 Google I/O 上開源了一個新的布局控件FlexboxLayout樱拴,他的作用就是實現(xiàn)這種流式布局的效果,以后再也不用去自定義了畔濒。個人見解剩晴,能用官方的就盡量用官方的。

使用詳解:

FlexboxLayout項目官方地址 https://github.com/google/flexbox-layout

1侵状、在app的build.gradle中赞弥,添加如下依賴

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

2、按照文檔趣兄,在xml中可以直接這樣使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.zx.flexboxlayout.MainActivity">

    <!--
    justifyContent:沿主軸的對齊方向
    alignContent:沿副軸的對齊方向
    -->
    <com.google.android.flexbox.FlexboxLayout
        android:id="@+id/flexboxLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:justifyContent="flex_start"
        app:alignContent="flex_start"
        app:flexDirection="row"
        app:flexWrap="wrap">

        <TextView
            style="@style/tv_style"
            android:text="1绽左、你好" />

        <TextView
            android:id="@+id/textview2"
            style="@style/tv_style"
            android:text="2、那就需要加班vyy呵呵哈哈哈或或或" />

        <TextView
            android:id="@+id/textview3"
            style="@style/tv_style"
            android:text="3艇潭、那就需要加班vyy呵呵或或" />

        <TextView
            style="@style/tv_style"
            android:text="4拼窥、行不行啊" />

        <TextView
            style="@style/tv_style"
            android:text="5、你妹啊" />

    </com.google.android.flexbox.FlexboxLayout>

</RelativeLayout>

效果圖蹋凝,就是上面的那樣闯团,我們以前自定義view實現(xiàn)的流式布局的效果都能實現(xiàn),可能會有細心的老鐵會發(fā)現(xiàn)在FlexboxLayout 里面會有幾個特殊的屬性仙粱,沒見過房交,別急,筆者這就把其中比較關鍵的幾個屬性和大伙兒講講伐割。

3.父容器FlexboxLayout 的屬性簡介
  • flexWrap 控制子元素是否換行候味,以及子元素排列的方向,它有3種取值
    nowrap (default) 默認:不換行
    wrap 自動換行
    wrap_reverse 表示副軸反轉隔心,也就是說如果你的子元素的方向是從左往右排列白群,并且自動換行的,那么此時硬霍,水平方向為你的主軸帜慢,豎直方向為你的副軸,效果就是唯卖,子元素從下往上粱玲,從左往右排列。

  • flexDirection 表示子元素的排列方向拜轨,元素的排列方向為主軸的方向抽减,該屬性有四種取值,不同取值對應不同的主副軸橄碾,看下面一張圖:

子元素排列方向.png

row (default) :默認是橫向從左往右排列
row_reverse 橫向倒置排列卵沉,從右往左
column 豎向從上往下排列
column_reverse 豎向倒置排列颠锉,從小往上

  • justifyContent 表示控件沿主軸對齊方向,它有5個取值
    flex_start (default) 默認:左對齊
    flex_end 主軸居右對齊
    center 主軸居中對齊
    space_between 兩端對齊史汗,子元素之間的間隔相等琼掠,但是兩端的子元素分別和左右兩邊的間距為0
    space_around 子元素兩端的距離相等,所有子元素兩端的距離都相相等

  • alignContent 表示控件在副軸上的對齊方向(針對多行元素)停撞,有5個值
    stretch (default) 默認值為stretch眉枕,表示占滿整個副軸,當然怜森,前提需要 把FlexboxLayout的高度改為match_parent才有效果,如果子元素不是很多谤牡,系統(tǒng)會自動放大子元素的高度以使之填滿父容器副硅。
    flex_start 與副軸起點對齊
    flex_end 與副軸終點對齊
    center
    space_between
    space_around 同上

  • alignItems 也是描述元素在副軸上的對齊方向(針對單行),屬性含義和上文基本一致翅萤,只是多了一個baseline恐疲,表示基線對齊,其余屬性不贅述套么。

4.子元素屬性簡介

1.)app:layout_order="2"
這個表示子元素的優(yōu)先級培己,默認值為1,數(shù)值越大越靠后顯示胚泌。

2.) app:layout_flexGrow="2"
這個和LinearLayout的權重屬性是一樣的省咨,表示該子元素所占權重的比例

3.) app:layout_flexShrink="2"

表示空間不足時子控件的縮放比例,0表示不縮放玷室,舉個例子:

<com.google.android.flexbox.FlexboxLayout  
    android:layout_width="300dp"  
    android:layout_height="wrap_content">  
  
    <TextView  
        android:layout_width="300dp"  
        android:layout_height="30dp"  
        app:layout_flexShrink="2"  
        android:background="@color/black"/>  
  
    <TextView  
        app:layout_flexShrink="1"  
        android:layout_width="100dp"  
        android:layout_height="30dp"  
        android:background="@color/black"/>  
</com.google.android.flexbox.FlexboxLayout>  

父容器總寬度為300dp零蓉,結果兩個子元素加起來就400,超過了100dp穷缤,總共需要縮小100dp敌蜂,根據(jù)flexShrink屬性,第一個TextView縮小100的三分之二津肛,第二個TextView縮小100的三分之一章喉。

它的屬性和用法還有很多,請自行前往官網(wǎng)查看
flexbox-layout的使用

差點忘了身坐,一般秸脱,我們的子View都是Java代碼動態(tài)生成的,那代碼顯示又是怎么弄的呢部蛇?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.zx.flexboxlayout.MainActivity">

    <!--
    justifyContent:沿主軸的對齊方向
    alignContent:沿副軸的對齊方向
    -->
    <com.google.android.flexbox.FlexboxLayout
        android:id="@+id/flexboxLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:justifyContent="flex_start"
        app:alignContent="flex_start"
        app:flexDirection="row"
        app:flexWrap="wrap"/>

</RelativeLayout>

Activity

public class MainActivity extends AppCompatActivity {

    String[] tags = {"婚姻育兒", "散文", "設計", "上班這點事兒", "影視天堂", "大學生活", "美人說", "運動和健身", "工具癖", "生活家", "程序員", "想法", "短篇小說", "美食", "教育", "心理", "奇思妙想", "美食", "攝影"};
    private FlexboxLayout flexboxLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        flexboxLayout = (FlexboxLayout) findViewById(R.id.flexboxLayout);
        //動態(tài)添加子View
        for (int i = 0; i < tags.length; i++) {
            flexboxLayout.addView(getFlexboxLayoutItemView(i));
        }
    }

    //獲取FlexboxLayout的子View
    private View getFlexboxLayoutItemView(int position) {
        View view = getLayoutInflater().inflate(R.layout.item_flex_box_layout, null, false);
        TextView itemTv = (TextView) view.findViewById(R.id.item_tv);
        itemTv.setText(tags[position]);
        return view;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撞反,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搪花,更是在濱河造成了極大的恐慌遏片,老刑警劉巖嘹害,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吮便,居然都是意外死亡笔呀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門髓需,熙熙樓的掌柜王于貴愁眉苦臉地迎上來许师,“玉大人,你說我怎么就攤上這事僚匆∥⑶” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵咧擂,是天一觀的道長逞盆。 經(jīng)常有香客問我,道長松申,這世上最難降的妖魔是什么云芦? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮贸桶,結果婚禮上舅逸,老公的妹妹穿的比我還像新娘。我一直安慰自己皇筛,他們只是感情好琉历,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著水醋,像睡著了一般善已。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上离例,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天换团,我揣著相機與錄音,去河邊找鬼宫蛆。 笑死艘包,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的耀盗。 我是一名探鬼主播想虎,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叛拷!你這毒婦竟也來了舌厨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤忿薇,失蹤者是張志新(化名)和其女友劉穎裙椭,沒想到半個月后躏哩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡揉燃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年扫尺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊汤。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡正驻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抢腐,到底是詐尸還是另有隱情姑曙,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布迈倍,位于F島的核電站伤靠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏授瘦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一竟宋、第九天 我趴在偏房一處隱蔽的房頂上張望提完。 院中可真熱鬧,春花似錦丘侠、人聲如沸徒欣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽打肝。三九已至,卻和暖如春挪捕,著一層夾襖步出監(jiān)牢的瞬間粗梭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工级零, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留断医,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓奏纪,卻偏偏與公主長得像鉴嗤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子序调,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案醉锅? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,728評論 1 92
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,453評論 0 6
  • *本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家發(fā)布 最近一直忙于學習后臺開發(fā),很久沒有寫Andr...
    _小河馬閱讀 67,708評論 13 159
  • 前言 工欲善其事必先利其器发绢,學習FlexboxLayout之前硬耍,先看看它是用來干嘛的垄琐,都有哪些特性,了解之后默垄,再來...
    T9的第三個三角閱讀 1,951評論 1 14
  • “皇上此虑!留給大明的時間不多啦!”屠沂“咣當”跪倒在大殿之上口锭。 紅袍狀元頓住腳步朦前,心道“:大明?朝中莫非又出了異象鹃操?...
    藍蘊玉閱讀 133評論 0 1