Flutter中MainAxisAlignment和CrossAxisAlignment詳解

MainAxisAlignment和CrossAxisAlignment簡(jiǎn)介

MainAxisAlignment(主軸)和CrossAxisAlignment(交叉軸)常用于Row和Column控件中,主要是用來控制子控件排列的位置,并可以配合textDirection和verticalDirection屬性來控制子控件排列的方向及改變MainAxisAlignment和CrossAxisAlignment的起始位置。

簡(jiǎn)單來說

MainAxisAlignment(主軸)就是與當(dāng)前控件方向一致的軸,而CrossAxisAlignment(交叉軸)就是與當(dāng)前控件方向垂直的軸在水平方向控件中,例如Row

MainAxisAlignment是水平的,默認(rèn)起始位置在左邊,排列方向?yàn)閺淖笾劣?,此時(shí)可以通過textDirection來改變MainAxisAlignment的起始位置和排列方向

CrossAxisAlignment是垂直的,默認(rèn)起始位置在中間,排列方向?yàn)閺纳现料?,此時(shí)可以通過verticalDirection來改變CrossAxisAlignment的起始位置及排列方向

在垂直方向的控件中,例如Column

MainAxisAlignment是垂直的,默認(rèn)起始位置在上邊,排列方向?yàn)閺纳现料拢藭r(shí)可以通過verticalDirection來改變MainAxisAlignment的起始位置及排列方向

CrossAxisAlignment是水平的,默認(rèn)起始位置在中間,此時(shí)可以通過textDirection來改變CrossAxisAlignment的起始位置

MainAxisAlignment

MainAxisAlignment是一個(gè)枚舉類型,代碼如下

enum MainAxisAlignment {

//將子控件放在主軸的開始位置

? start,?

? //將子控件放在主軸的結(jié)束位置

? end,

? //將子控件放在主軸的中間位置

? center,

? //將主軸空白位置進(jìn)行均分,排列子元素,手尾沒有空隙

? spaceBetween,

? //將主軸空白區(qū)域均分,使中間各個(gè)子控件間距相等,首尾子控件間距為中間子控件間距的一半

? spaceAround,

? //將主軸空白區(qū)域均分,使各個(gè)子控件間距相等

? spaceEvenly,

}

我們先寫一個(gè)帶漸變的正方形

/*

* 一個(gè)帶漸變顏色的正方形

* */

class Box extends StatelessWidget {

? String index;

? double boxSize=100;

? Box(String index) {

? ? this.index = index;

? }

? @override

? Widget build(BuildContext context) {

? ? return Container(

? ? ? width: boxSize,

? ? ? height: boxSize,

? ? ? alignment: Alignment.center,

? ? ? decoration: BoxDecoration(

? ? ? ? gradient: LinearGradient(

? ? ? ? ? ? colors: [Colors.orangeAccent, Colors.orange, Colors.deepOrange]),

? ? ? ),

? ? ? child: Text(

? ? ? ? index,

? ? ? ? style: TextStyle(

? ? ? ? ? color: Colors.white,

? ? ? ? ? fontSize: 20,

? ? ? ? ? fontWeight: FontWeight.bold,

? ? ? ? ),

? ? ? ),

? ? );

? }

}

長(zhǎng)這樣



在Row中MainAxisAlignment的效果

前面我們說到了,在水平方向的控件中,MainAxisAlignment就是水平的,其默認(rèn)的方向是從左到右,也就是說默認(rèn)的起始位置在左邊,我們可以通過textDirection來改變水平方向的起始位置。

下面我們先來放三個(gè)正方形,看看默認(rèn)的效果

Container(

? ? ? width: double.infinity,

? ? ? height: 500,

? ? ? margin: EdgeInsets.all(10),

? ? ? decoration: BoxDecoration(

? ? ? ? border: Border.all(

? ? ? ? ? color: Colors.black,

? ? ? ? ? width: 1,

? ? ? ? ),

? ? ? ),

? ? ? child: Row(

? ? ? ? children: <Widget>[

? ? ? ? ? Box("1"),

? ? ? ? ? Box("2"),

? ? ? ? ? Box("3"),

? ? ? ? ],

? ? ? ),

? ? );

MainAxisAlignment.start

mainAxisAlignment的默認(rèn)值就是MainAxisAlignment.start,當(dāng)我們不設(shè)置textDirection屬性時(shí),默認(rèn)就是從左至右的方向,起始位置就是在左邊的

如下

我們更改一下textDirection的值為從右至左

textDirection: TextDirection.rtl,


可以看到,水平方向的起始位置就變成了右邊,子控件排列的方向就變成了從右至左進(jìn)行排列,后面的值就不在演示該屬性了,可自行嘗試

MainAxisAlignment.center

將子控件放在主軸的中間位置



MainAxisAlignment.end

將子控件放在主軸的結(jié)束位置



MainAxisAlignment.spaceAround

將主軸空白區(qū)域均分,使中間各個(gè)子控件間距相等,首尾子控件距邊緣間距為中間子控件間距的一半



MainAxisAlignment.spaceBetween

將主軸空白位置進(jìn)行均分,排列子元素,首尾子控件距邊緣沒有間隙



MainAxisAlignment.spaceEvenly

將主軸空白區(qū)域均分,使各個(gè)子控件間距相等



在Column中MainAxisAlignment的效果

在垂直方向的控件中,MainAxisAlignment就是垂直的,此時(shí)可以通過verticalDirection來改變MainAxisAlignment的起始位置及排列方向

例如

Container(

? ? ? width: double.infinity,

? ? ? height: 500,

? ? ? margin: EdgeInsets.all(10),

? ? ? decoration: BoxDecoration(

? ? ? ? border: Border.all(

? ? ? ? ? color: Colors.black,

? ? ? ? ? width: 1,

? ? ? ? ),

? ? ? ),

? ? ? child: Column(

? ? ? ? mainAxisAlignment: MainAxisAlignment.start,

? ? ? ? children: <Widget>[

? ? ? ? ? Box("1"),

? ? ? ? ? Box("2"),

? ? ? ? ? Box("3"),

? ? ? ? ],

? ? ? ),

? ? );

MainAxisAlignment.start

將子控件放在主軸的開始位置,默認(rèn)值即為start,verticalDirection的默認(rèn)值為VerticalDirection.down,也就是從上至下的方向


下面我們來修改verticalDirection的值為up

Column(

? ? ? ? mainAxisAlignment: MainAxisAlignment.start,

? ? ? ? verticalDirection: VerticalDirection.up,

? ? ? ? children: <Widget>[

? ? ? ? ? Box("1"),

? ? ? ? ? Box("2"),

? ? ? ? ? Box("3"),

? ? ? ? ],

? ? ? ),


可以看到,垂直方向的起始位置就變成了下邊,子控件排列的方向就變成了從下至上進(jìn)行排列,后面的值就不再演示該屬性了,可自行嘗試

MainAxisAlignment.center

將子控件放在主軸的中間位置



MainAxisAlignment.end

將子控件放在主軸的結(jié)束位置



MainAxisAlignment.spaceAround

將主軸空白區(qū)域均分,使中間各個(gè)子控件間距相等,首尾子控件距邊緣間距為中間子控件間距的一半



MainAxisAlignment.spaceBetween

將主軸空白位置進(jìn)行均分,排列子元素,首尾子控件距邊緣沒有間隙



MainAxisAlignment.spaceEvenly

將主軸空白區(qū)域均分,使各個(gè)子控件間距相等



CrossAxisAlignment

前面我們已經(jīng)說了,在Row(水平排列)控件中,CrossAxisAlignment的方向就是垂直的,在 Column(垂直排列)控件中,CrossAxisAlignment的方向就是水平的。

enum CrossAxisAlignment {

//將子控件放在交叉軸的起始位置

? start,

//將子控件放在交叉軸的結(jié)束位置

? end,

//將子控件放在交叉軸的中間位置

? center,

//使子控件填滿交叉軸

? stretch,

//將子控件放在交叉軸的上,并且與基線相匹配(不常用)

? baseline,

}

在Row中CrossAxisAlignment的效果

mainAxisAlignment的默認(rèn)值是MainAxisAlignment.start,我們來看看CrossAxisAlignment不同的值顯示效果是什么樣的

CrossAxisAlignment.start

將子控件放在交叉軸的起始位置


此時(shí),我們可以通過verticalDirection來控制交叉軸的起始位置及排列方向。

Row(

? ? ? ? crossAxisAlignment: CrossAxisAlignment.start,

? ? ? ? verticalDirection: VerticalDirection.up,

? ? ? ? children: <Widget>[

? ? ? ? ? Box("1"),

? ? ? ? ? Box("2"),

? ? ? ? ? Box("3"),

? ? ? ? ],

? ? ? )


可以看到,交叉軸的排列方向修改為從下至上,起始位置也變成了下方。下面其他的值效果類似,就不演示verticalDirection了

CrossAxisAlignment.center

將子控件放在交叉軸的中間位置,同樣的可以通過TextDirection來指定起始位置



CrossAxisAlignment.end

將子控件放在交叉軸的結(jié)束位置



CrossAxisAlignment.stretch

使子控件填滿交叉軸



在Column中CrossAxisAlignment的效果

Column(

? ? ? ? children: <Widget>[

? ? ? ? ? Box("1"),

? ? ? ? ? Box("2"),

? ? ? ? ? Box("3"),

? ? ? ? ],

? ? ? ),

CrossAxisAlignment.start



CrossAxisAlignment.center



CrossAxisAlignment.end



CrossAxisAlignment.stretch



總結(jié)

MainAxisAlignment和CrossAxisAlignment他們的值并不多,理解起來也比較簡(jiǎn)單,配合textDirection和verticalDirection基本上可以滿足我們的需求了。

關(guān)于textDirection和verticalDirection我們不必死記硬背Row中是誰(shuí)控制誰(shuí),在Column中是誰(shuí)控制誰(shuí)

我們只需要記住

textDirection就是用來控制水平方向的起始位置和排列方向

verticalDirection就是用來控制垂直方向的起始位置和排列方向

然后記住

MainAxisAlignment(主軸)就是與當(dāng)前控件方向一致的軸

CrossAxisAlignment(交叉軸)就是與當(dāng)前控件方向垂直的軸

記住了這兩點(diǎn),基本上MainAxisAlignment和CrossAxisAlignment就沒什么問題了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容