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