2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jetpack ComposeのModifier.borderを綺麗に適用する

2
Last updated at Posted at 2025-11-03

Modifier.border で簡単に枠線を引くことができますが、そのまま使うと境界が滲みます。
結論から言うと、枠線の太さと同じだけコンテンツ側に padding を入れると境界の滲みがなくなり綺麗になります。

実装例

例えば背景色+枠線をつける実装を素直にすると以下のようになると思いますが、

val shape = CircleShape
Box(
    modifier = Modifier
        .clip(shape)
        .size(120.dp)
        .background(Color.Red)
        .border(1.dp, MaterialTheme.colorScheme.outline, shape),
) {
}

この場合枠線の外側に少しだけ背景色がはみ出るので境界が滲みます。

スクショ 拡大
スクリーンショット 2025-11-03 11.23.02.png

これを回避するには枠線の太さと同じだけコンテンツ側に padding を入れると綺麗になります。
先ほどの例だと背景色部分と枠線部分を分離してネストさせ、padding を適用することで綺麗に枠線を適用することができます。

val shape = CircleShape
val borderWidth = 1.dp
Box(
    modifier = Modifier
        .size(120.dp)
        .border(borderWidth, MaterialTheme.colorScheme.outline, shape),
) {
    Box(
        modifier = Modifier
            .matchParentSize()
            .padding(borderWidth)
            .clip(shape)
            .background(Color.Red),
    ) {
    }
}
スクショ 拡大
スクリーンショット 2025-11-03 11.32.42.png

画像の場合

具体的な例だとアイコン画像のような画像に枠線をつけたい場合が多いと思います。
この場合も同様に padding をつけるといいのですが、枠線と画像でネストさせてもいいですし、Modifier の順番を気をつけることでネストなしでも適用することができます。
border -> padding -> clip とすることでネストなしで枠線を綺麗に適用することができます。

val shape = CircleShape
val borderWidth = 1.dp
Image(
    painter = painterResource(R.drawable.sample),
    contentDescription = null,
    modifier = Modifier
        .size(120.dp)
        .border(borderWidth, MaterialTheme.colorScheme.outline, shape)
        .padding(borderWidth)
        .clip(shape)
)
スクショ 拡大
スクリーンショット 2025-11-03 11.45.09.png
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?