🐻‍❄️

[Jetpack Compose]VerticalDividerとHorizontalDividerを自作する

2023/08/01に公開

VerticalDividerを自作する

Dividerは水平方向に線を描画する用に定義されていて、垂直方向の線の描画する用に定義されていない。なので垂直方向に線を描画するVerticalDividerを自作して、垂直方向に簡単に線を描画できるようにしてみる。

定義

@Composable
fun VerticalDivider(
    modifier: Modifier = Modifier,
    thickness: Dp = DividerDefaults.Thickness,
    color: Color = DividerDefaults.color,
) {
    val targetThickness = if (thickness == Dp.Hairline) {
        (1f / LocalDensity.current.density).dp
    } else {
        thickness
    }
    Box(
        modifier
            .fillMaxHeight()
            .width(targetThickness)
            .background(color = color)
    )
}

サンプル

@Composable
fun Sample() {
    Row(
        modifier = Modifier
            .height(100.dp)
            .wrapContentWidth()
            .background(Color.LightGray)
    ) {
        Text(text = "1", modifier = Modifier.align(Alignment.CenterVertically))
        VerticalDivider(thickness = 3.dp, color = Color.Blue)
        Text(text = "2", modifier = Modifier.align(Alignment.CenterVertically))
        VerticalDivider(thickness = 6.dp, color = Color.Green)
        Text(text = "3", modifier = Modifier.align(Alignment.CenterVertically))
    }
}

HorizonDividerも自作する

Dividerで水平方向の線の描画はできる。やはりVerticalDividerと対となるHorizontalDividerもある方がわかりやすい。なのでHorizontalDividerも自作してみた。

定義

@Composable
fun HorizontalDivider(
    modifier: Modifier = Modifier,
    thickness: Dp = DividerDefaults.Thickness,
    color: Color = DividerDefaults.color,
) {
    Divider(modifier, thickness, color)
}

サンプル

@Composable
fun Sample() {
    Row(
        modifier = Modifier
            .height(100.dp)
            .wrapContentWidth()
            .background(Color.LightGray)
    ) {
        Text(text = "1", modifier = Modifier.align(Alignment.CenterVertically))
        VerticalDivider(thickness = 3.dp, color = Color.Blue)
        Text(text = "2", modifier = Modifier.align(Alignment.CenterVertically))
        VerticalDivider(thickness = 6.dp, color = Color.Green)
        Text(text = "3", modifier = Modifier.align(Alignment.CenterVertically))
    }
}

Discussion