雖然看了這麼多元件,但在實作 UI 時,通常會組合多個元件,為了讓 UI 清楚、易懂、好看,如何排版元件就變得很重要了!若讀者曾自行把多個元件放在 Window 裡應該會發現,元件都會疊在一起無法使用,這是因為沒有跟 Compose 說明要怎麼排版這些元件。在今年的耕讀筆記,就要來研究一下幾個最常用的排版元件的使用方式。
Column 元件我們所使用的顯示裝置大多都是矩型的空間,因此在排版上通常都會將元件依矩型空間縱排或橫排。若要將元件縱排,可使用 Column 元件。Column 元件除了 content 參數是必填外,其餘的參數都有預設值,因此可以很簡單直覺的使用:
Column {
Text(text = "...",fontSize = 20.sp)
Text(text = "...")
}
讀者可以比較一下,若上例的兩個 Text 元件沒有放在 Column 內的話,顯示時會疊在一起。由此可見,Column 是將元件以縱向的順序排列。
Column 元件裡的垂直排列與水平對齊預設 Column 會將其內元件以靠上及靠左對齊排列,若想要修改這個排列組合,可以透過 verticalArrangement 及 horizontalAlignment 兩個參數來設定垂直及水平對齊方式。不過要注意的是,若沒有設定 Column 元件尺寸的話,Compose 會不知道以多少空間來計算元件的排列及對齊,因此通常會再以 Modifier 來設定 Column 的寬高:
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(text = "...", fontSize = 20.sp)
Text(text = "...")
}
在上例裡,我們將 Column 的垂直及水平對齊方式皆設為置中,並以 Modifier 將 Column 的內部空間撐到跟 Window 一樣大,因此可以看到兩行字會放在整個視窗的正中央。
Column 支援的垂直排列方式有:
Top:靠上。Center:置中。Bottom:靠下。SpaceEvenly:水平等距分配(左右也算)。SpaceBetween:水平等距分配(不算左右)。SpaceAround:水平等距分配(左右定值不均分)。Column 支援的水平對齊方式有:
Start:靠左。CenterHorizontally:置中。End:靠右。若不清楚這些設定的差別,可參考 Jetpack Compose 官方文件裡的動畫:

Row 元件看過 Column 後,就更容易理解 Row 的作用了。Column 是將元件垂直排,Row 則是將元件水平排。比方說將三個 Icon 放在 Row 裡,就可以看到三個圖示依照程式碼由上往下的順序,對應到 UI 裡由左至右的排列:
Row {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = "Favorite Icon"
)
Icon(
imageVector = Icons.Filled.Lock,
contentDescription = "Lock Icon"
)
Icon(
imageVector = Icons.Filled.Share,
contentDescription = "Share Icon"
)
}
Row 元件裡的垂直對齊與水平排列Row 預設也是將其內元件以靠上及靠左對齊排列,若想要修改這個排列組合,我們可以透過 verticalAlignment 及 horizontalArrangement 兩個參數來設定垂直及水平對齊方式(注意一下參數名稱跟 Column 長得很像但組合方式不同!)。另外,我們一樣要透過 Modifier 將 Row 元件撐大,這樣才看得出對齊效果:
Row(
modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceEvenly,
) {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = "Favorite Icon"
)
Icon(
imageVector = Icons.Filled.Lock,
contentDescription = "Lock Icon"
)
Icon(
imageVector = Icons.Filled.Share,
contentDescription = "Share Icon"
)
}
Row 支援的垂直對齊方式有:
Top:靠上。CenterVertically:置中。Bottom:靠下。Row 支援的水平排列方式有:
Start:靠左。Center:置中。End:靠右。SpaceEvenly:水平等距分配(左右也算)。SpaceBetween:水平等距分配(不算左右)。SpaceAround:水平等距分配(左右定值不均分)。若不清楚這些設定的差別,可參考 Jetpack Compose 官方文件裡的動畫:

當然實際開會情境會更複雜,透過 Column 與 Row 的層層疊疊,就可以組合出很複雜的介面:
Column(
modifier = Modifier.width(400.dp).padding(12.dp)
) {
Text(
text = "What is Lorem Ipsum?",
fontSize = 20.sp
)
Text(
text = "Lorem Ipsum is ..."
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround
) {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = "Favorite Icon",
)
Icon(
imageVector = Icons.Filled.Lock,
contentDescription = "Lock Icon",
)
Icon(
imageVector = Icons.Filled.Lock,
contentDescription = "Lock Icon",
)
}
}
在上面的例子裡,我們做出一個有標題、內文及三個等距並排圖示的 UI,透過排版元件的使用,UI 就可以如我們所想的排列喔!