Flutter基礎(chǔ)篇(6)-- 水平和垂直布局詳解

版權(quán)聲明:本文首發(fā)在公眾號(hào)Flutter那些事谜洽,未經(jīng)授權(quán),嚴(yán)禁轉(zhuǎn)載。


本文示例代碼發(fā)布在Github滥壕,地址為: https://github.com/AweiLoveAndroid/Flutter-learning/blob/master/README-CN.md


Flutter系列博文鏈接 ↓:

工具安裝:

Flutter基礎(chǔ)篇:

Flutter進(jìn)階篇:

Dart語(yǔ)法系列博文鏈接 ↓:

Dart語(yǔ)法基礎(chǔ)篇:

Dart語(yǔ)法進(jìn)階篇:


先來(lái)看看本文的目錄,如下圖所示:

本文目錄

在原生Android開發(fā)中叁丧,我們經(jīng)常會(huì)用LinearLayout來(lái)達(dá)到水平或垂直方向的布局啤誊,在Flutter中有兩個(gè)常用的組件也能夠做到類似的效果,分別是RowColumn組件拥娄,Row組件主要功能是處理水平方向的布局蚊锹,Column組件主要功能是處理垂直方向的布局。下文會(huì)具體講解在Flutter中如何使用Row和Column組件實(shí)現(xiàn)LinearLayout效果稚瘾,以及兩者之間的對(duì)比牡昆,方便大家對(duì)比學(xué)習(xí)。


LinearLayout 里面的android:orientation="horizontal”屬性相當(dāng)于Row組件摊欠,LinearLayout 里面的 android:orientation="vertical”屬性相當(dāng)于Column組件迁杨。

Flutter和LinearLayout的對(duì)比圖示如下:

安卓的orientation屬性在Flutter中的體現(xiàn)

Row的使用示例代碼如下所示:

Row的使用示例代碼

Column的使用示例代碼如下所示:

Column的使用示例代碼

Flutter中的Row以及Column使用效果圖如下所示:

Flutter中的Row以及Column使用效果圖

這里是Android里面的使用(由于Flutter效果和Android的是一樣的,后文的安卓效果圖就不再展示了)

Android里面的使用

LinearLayout 里面的android:layout_width="wrap_content"或者 android:layout_height="wrap_content"屬性相當(dāng)于Row/Column組件里面的 MainAxisSize.min 屬性凄硼。

LinearLayout 里面的android:layout_width="match_parent"或者android:layout_height="match_parent"屬性相當(dāng)于Row/Column組件里面的 MainAxisSize.max 屬性铅协。Row/Column組件如果沒(méi)有設(shè)置mainAxisSize屬性,默認(rèn)為max屬性值摊沉。第二小節(jié)中的Row/Column組件我們并沒(méi)有設(shè)置mainAxisSize屬性狐史,但是我們可以看到它的效果是MainAxisSize.max 屬性的效果(Row自動(dòng)填充寬為屏幕的寬,Column自動(dòng)填充高為屏幕的高)说墨。

Flutter和LinearLayout的對(duì)比圖示如下:

Flutter和LinearLayout的對(duì)比圖

Flutter使用圖解如下:

Flutter中使用 MainAxisSize.max 效果圖
Flutter中使用 MainAxisSize.min 效果圖

這個(gè)是最復(fù)雜的骏全,需要重點(diǎn)掌握。gravity屬性在Android里面是用于指定控件本身或子控件的對(duì)齊屬性尼斧。在Flutter中我們可以使用 Row/Column組件MainAxisAlignment 以及 CrossAxisAlignment 實(shí)現(xiàn)控件的對(duì)齊效果姜贡。

MainAxisAlignment 是設(shè)置主軸方向的對(duì)齊方式。如果我們給 Row 組件設(shè)置 MainAxisAlignment 屬性棺棵,那么它的主軸為水平方向楼咳。如果我們給 Column 組件設(shè)置 MainAxisAlignment 屬性,那么它的主軸為垂直方向烛恤。

MainAxisAlignment 有6個(gè)屬性值母怜,默認(rèn)值為start,分別是:

1缚柏、MainAxisAlignment.start苹熏,將子控件放在主軸的起始位置。
2、MainAxisAlignment.end轨域,將子控件放在主軸末尾袱耽。
3、MainAxisAlignment.center干发,將子控件放在主軸中間位置朱巨。

下面這三個(gè)屬性需要特別關(guān)注一下:

// 將主軸方向上的空白區(qū)域等分,使得子控件之間的空白區(qū)域相等铐然,
// 兩端的子控件都靠近首尾,沒(méi)有間隙恶座。
4搀暑、MainAxisAlignment.spaceBetween 

// 將主軸方向上的空白區(qū)域等分,使得子控件之間的空白區(qū)域相等跨琳,
// 兩端的子控件都靠近首尾自点,首尾子控件的空白區(qū)域?yàn)?/2。
5脉让、MainAxisAlignment.spaceAround 

// 將主軸方向上的空白區(qū)域等分桂敛,使得子控件之間的空白區(qū)域相等,包括首尾溅潜。
6术唬、MainAxisAlignment.spaceEvenly

CrossAxisAlignment是設(shè)置交叉軸方向的對(duì)齊方式,比如當(dāng)前給 Row 組件設(shè)置 CrossAxisAlignment 屬性滚澜,那么它的交叉軸為垂直方向粗仓。如果我們給 Column 組件設(shè)置 CrossAxisAlignment 屬性,那么它的交叉軸為水平方向设捐。

CrossAxisAlignment 有5個(gè)屬性值借浊,默認(rèn)值為center,分別是:

CrossAxisAlignment.start, 子控件顯示在交叉軸的起始位置萝招。
CrossAxisAlignment.end, 子控件顯示在交叉軸的末尾位置蚂斤。
CrossAxisAlignment.center, 子控件顯示在交叉軸的中間位置。
CrossAxisAlignment.stretch, 子控件完全填充交叉軸方向的空間槐沼。
CrossAxisAlignment.baseline, 讓子控件的baseline在交叉軸方向?qū)R曙蒸。

具體的示例如下:

(1)Row的子組件對(duì)齊

下面這個(gè)是Row的子組件對(duì)齊的示例:

示例中設(shè)置的主軸的屬性值是:MainAxisAlignment.spaceEvenly,交叉軸的屬性值是:CrossAxisAlignment.end

Row的子組件對(duì)齊示例代碼

使用圖示如下圖所示:

Row的子組件對(duì)齊效果圖

(2)Column的子組件對(duì)齊

下面這個(gè)是Column的子組件對(duì)齊的示例:

示例中設(shè)置的主軸的屬性值是:MainAxisAlignment.spaceEvenly岗钩,交叉軸的屬性值是:CrossAxisAlignment.end

Column的子組件對(duì)齊示例代碼

使用圖示如下圖所示:

Column的子組件對(duì)齊效果圖

在Android中 layout_weight 是LinearLayout里面的屬性逸爵,它是用來(lái)給子設(shè)置權(quán)重的,表示給子按照設(shè)置的比例去分配空間凹嘲。在Flutter中我們可以使用 Expanded 包裹RowColumn組件,使用 Expanded 組件里面的 flex屬性 去實(shí)現(xiàn)同樣的效果师倔。

先來(lái)看看Row是會(huì)如何給子設(shè)置權(quán)重的,示例代碼如下所示:

Row給子設(shè)置權(quán)重示例代碼

上例中我寫了一個(gè)Row,里面有3個(gè)并排的Icon組件趋艘,權(quán)重分別是1疲恢、2、5瓷胧,為了好區(qū)分显拳,我給每個(gè)Icon加了不同的背景顏色。為了代碼更優(yōu)雅搓萧,我封裝了一個(gè)buildIcon(IconData icon, {int flex = 1, Color color}) 函數(shù)杂数,IconData是必須傳入的參數(shù); 參數(shù)2是權(quán)重,默認(rèn)值為1; 參數(shù)3是組件的背景顏色瘸洛,參數(shù)2和參數(shù)3是可選參數(shù)揍移,可以根據(jù)需要進(jìn)行傳入。

我們看看效果圖反肋,如圖所示:

效果圖

同理那伐,我們只需要把上例中的 new Row替換成new Column就可以實(shí)現(xiàn)垂直方向設(shè)置權(quán)重,如上圖右邊所示石蔗。


在Flutter中的Row或Column中關(guān)于 direction 有2個(gè)需要掌握的屬性罕邀,分別是:textDirection 以及verticalDirection。其中textDirection屬性在Row組件中起到很大作用养距,verticalDirection屬性在Column組件中起到很大作用诉探。

textDirection 的屬性值為 TextDirection.ltr,表示所有的子控件都是從左到右順序排列棍厌,這是默認(rèn)值阵具。如果為TextDirection.rtl 表示從右邊開始向左邊倒序排列。

verticalDirection 的屬性值為 VerticalDirection.down, 表示所有的子控件都是從上到下順序排列定铜。如果為VerticalDirection.up 從底部開始向上倒序排列阳液。

先來(lái)看看Row中是如何使用的,我們這里使用的 textDirection 屬性揣炕,是還是拿本章一開始的那個(gè)例子做修改帘皿,核心代碼如下所示:

Row中使用textDirection屬性

再來(lái)看看Column是如何使用的,可以看出只需要把 textDirection 屬性換成 verticalDirection 就可以了畸陡。是不是很簡(jiǎn)單鹰溜?

Column中使用verticalDirection屬性

我們看一下效果圖,如圖所示:

使用效果圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丁恭,一起剝皮案震驚了整個(gè)濱河市曹动,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牲览,老刑警劉巖墓陈,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贡必,警方通過(guò)查閱死者的電腦和手機(jī)兔港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仔拟,“玉大人衫樊,你說(shuō)我怎么就攤上這事±ǎ” “怎么了科侈?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炒事。 經(jīng)常有香客問(wèn)我臀栈,道長(zhǎng),這世上最難降的妖魔是什么羡洛? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任挂脑,我火速辦了婚禮藕漱,結(jié)果婚禮上欲侮,老公的妹妹穿的比我還像新娘。我一直安慰自己肋联,他們只是感情好威蕉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橄仍,像睡著了一般韧涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侮繁,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天虑粥,我揣著相機(jī)與錄音,去河邊找鬼宪哩。 笑死娩贷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锁孟。 我是一名探鬼主播彬祖,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼品抽!你這毒婦竟也來(lái)了储笑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圆恤,失蹤者是張志新(化名)和其女友劉穎突倍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赘方,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烧颖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄陡。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炕淮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跳夭,到底是詐尸還是另有隱情涂圆,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布币叹,位于F島的核電站润歉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颈抚。R本人自食惡果不足惜踩衩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贩汉。 院中可真熱鬧驱富,春花似錦、人聲如沸匹舞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赐稽。三九已至叫榕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姊舵,已是汗流浹背晰绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留括丁,地道東北人荞下。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躏将,于是被迫代替她去往敵國(guó)和親锄弱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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