Android Jetpack Compose Modifier 介紹、常用方式示範 下篇(align, horizontalArrangement, verticalArrangement, weight)
延伸閱讀: Android Jetpack Compose Modifier 介紹、常用方式示範 上篇(size, padding, border, clip)
父容器是 Box,需要傳入 Alignment:
父容器是 Row,需要傳入 Alignment.Vertical:
父容器是 Column ,需要傳入 Alignment.Horizontal:
疑?這樣好像怪怪的,但其實這是最容易搞混的部分。
Column 是垂直一直增加內容,單個內容使用 align 可以決定靠左、中、右。
Row 是水平一直增加內容,單個內容使用 align 可以決定靠上、中、下。
Box 則可以將單個內容指定在 4 邊中間、4 個角和正中間。
Row 的效果如下:
Column 的效果如下: 看完上面的圖後會發現圖中的種類有 7 個,而上面 Arrangement 列出的只有六個,少了 Equal Weight ,全部相等。而這個可以透過將所有項目都設定相同的 weight 來達成:
參考資料:
Android developers - Compose 版面配置基本概念
Android developers - Compose 修飾符清單
Android developers - Alignment
Android developers - Arrangement
對齊 align
對齊需要看父元件是什麼來決定 align 內可以傳入什麼參數父容器是 Box,需要傳入 Alignment:
- Alignment.TopStart
- Alignment.TopCenter
- Alignment.TopEnd
- Alignment.CenterStart
- Alignment.Center
- Alignment.CenterEnd
- Alignment.BottomStart
- Alignment.BottomCenter
- Alignment.BottomEnd
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Box {
Text("左上", modifier = Modifier
.background(color = Color.Yellow)
.align(Alignment.TopStart)
)
Text("中上", modifier = Modifier
.background(color = Color.Yellow)
.align(Alignment.TopCenter)
)
Text("右上", modifier = Modifier
.background(color = Color.Yellow)
.align(Alignment.TopEnd)
)
Text("左中", modifier = Modifier
.background(color = Color.Green)
.align(Alignment.CenterStart)
)
Text("中", modifier = Modifier
.background(color = Color.Green)
.align(Alignment.Center)
)
Text("右中", modifier = Modifier
.background(color = Color.Green)
.align(Alignment.CenterEnd)
)
Text("左下", modifier = Modifier
.background(color = Color.Blue)
.align(Alignment.BottomStart)
)
Text("中下", modifier = Modifier
.background(color = Color.Blue)
.align(Alignment.BottomCenter)
)
Text("右下", modifier = Modifier
.background(color = Color.Blue)
.align(Alignment.BottomEnd)
)
}
父容器是 Row,需要傳入 Alignment.Vertical:
- Alignment.Top
- Alignment.CenterVertically
- Alignment.Bottom
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Row(
Modifier.fillMaxSize()
) {
Text(
"Top", modifier = Modifier
.background(color = Color.Yellow)
.align(Alignment.Top)
)
Text(
"CenterVertically", modifier = Modifier
.background(color = Color.Green)
.align(Alignment.CenterVertically)
)
Text(
"Bottom", modifier = Modifier
.background(color = Color.Cyan)
.align(Alignment.Bottom)
)
}
父容器是 Column ,需要傳入 Alignment.Horizontal:
- Alignment.Start
- Alignment.CenterHorizontally
- Alignment.End
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Column(
Modifier.fillMaxSize()
) {
Text(
"Start", modifier = Modifier
.background(color = Color.Yellow)
.align(Alignment.Start)
)
Text(
"CenterHorizontally", modifier = Modifier
.background(color = Color.Green)
.align(Alignment.CenterHorizontally)
)
Text(
"End", modifier = Modifier
.background(color = Color.Cyan)
.align(Alignment.End)
)
}
疑?這樣好像怪怪的,但其實這是最容易搞混的部分。
Column 是垂直一直增加內容,單個內容使用 align 可以決定靠左、中、右。
Row 是水平一直增加內容,單個內容使用 align 可以決定靠上、中、下。
Box 則可以將單個內容指定在 4 邊中間、4 個角和正中間。
水平和垂直排列對齊方式
上面提到 align 是指定單一內容的對齊方式,那在 Column 或 Row 中想要對齊該怎麼做呢?可以使用 Arrangement:- Arrangement.Start
- Arrangement.Center
- Arrangement.End
- Arrangement.SpaceEvenly
- Arrangement.SpaceAround
- Arrangement.SpaceBetween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Row(
Modifier.fillMaxSize(),
horizontalArrangement = Arrangement.Start,
) {
Text(
"Top", modifier = Modifier
.background(color = Color.Yellow)
)
Text(
"CenterVertically", modifier = Modifier
.background(color = Color.Green)
)
Text(
"Bottom", modifier = Modifier
.background(color = Color.Cyan)
)
}
Row 的效果如下:
Column 的效果如下: 看完上面的圖後會發現圖中的種類有 7 個,而上面 Arrangement 列出的只有六個,少了 Equal Weight ,全部相等。而這個可以透過將所有項目都設定相同的 weight 來達成:
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
Column {
Row {
Text("Top", modifier = Modifier.background(color = Color.Yellow))
Text("CenterVertically", modifier = Modifier.background(color = Color.Green))
Text("Bottom", modifier = Modifier.background(color = Color.Cyan))
}
Row {
Text(
"Top", modifier = Modifier
.background(color = Color.Yellow)
.weight(1f)
)
Text(
"CenterVertically", modifier = Modifier
.background(color = Color.Green)
.weight(1f)
)
Text(
"Bottom", modifier = Modifier
.background(color = Color.Cyan)
.weight(1f)
)
}
}
參考資料:
Android developers - Compose 版面配置基本概念
Android developers - Compose 修飾符清單
Android developers - Alignment
Android developers - Arrangement
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com