🐻❄️
[Jetpack Compose]BoxのmatchParentで特定の要素に他の要素をマスクする
方法
特定の要素の上に他の要素をマスクしたい場合にはBox
内に配置した子要素に対してmatchParent
を付加することでうまく実装ができる。
-
Box
にはwrapContentSize
を付加して子要素の一番大きいサイズにあわせる - 子要素の
Text
はsize
を付加して固定サイズにする - 子要素の
Spacer
はmatchParentSize
を付加してBox
のサイズにあわせる(Spacer
の子要素を除く,子要素の中で一番大きいサイズにあわせる、ようにする) - このように実装すると
Box
はText
のサイズにあわせる、Spacer
はBox
のサイズにあわせる、という関係性が構築できる。そのためSpacer
とText
のサイズが同じになり、このようなマスク表示が可能になる
@Composable
fun SampleBox() {
Box(
modifier = Modifier
.wrapContentSize()
.background(Color.White)
) {
Text(
text = "TEXT",
modifier = Modifier
.size(200.dp)
.background(Color.Red.copy(alpha = 0.5f))
)
Spacer(
modifier = Modifier
.matchParentSize()
.background(Color.Green.copy(alpha = 0.5f))
)
}
}
よくある間違い
特定の要素の上に他の要素をマスクしたい場合によくある間違いはBox
内に配置した要素に対してfillMaxSize
を付加してしまう間違い。
-
Box
にはwrapContentSize
を付加して子要素の一番大きいサイズにあわせる - 子要素の
Text
はsize
を付加して固定サイズにする - 子の要素の
Spacer
はfillMaxSize
を更かして可能な限り大きなサイズにする - このように実装すると
Box
はSpacer
のサイズにあわせる、Spacer
は可能な限りサイズを大きくする、という関係性が構築される。そのため以下のようにSpacer
のサイズが大きくなってしまい、Text
のサイズが同じにならずマスク表示にはならない。
@Composable
fun SampleBox() {
Box(
modifier = Modifier
.wrapContentSize()
.background(Color.White)
) {
Text(
text = "TEXT",
modifier = Modifier
.align(Alignment.Center)
.size(200.dp)
.background(Color.Red.copy(alpha = 0.5f))
)
Spacer(
modifier = Modifier
.fillMaxSize()
.background(Color.Green.copy(alpha = 0.5f))
)
}
}
参考資料
Discussion