본문 바로가기
Android/Jetpack Compose Concepts

JETPACK COMPOSE: Box에 대해 알아보자

by 개발자J의일상 2022. 1. 11.
반응형

A Simple Box Layout Example

여기 MainActivity.kt에서 BoxExample0라는 composable function을 만들었습니다. 그리고 거기에 간단한 Box를 추가했습니다.

그런 다음 onCreate()의 setContect 블록에서 해당 함수를 호출했습니다.

 

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
BoxExample0()
}
}
}
@Composable
fun BoxExample0() {
Box(
modifier = Modifier
.background(color = Color.Blue)
.size(150.dp, 200.dp)
)
}

위의 코드는 width = 150.dp, height = 200.dp 이고 blue color box를 그리는 코드입니다.

 

Child Elements of a Box Layout

다음으로 해당 Box에 두개의 자식 요소를 추가합니다. (또 다른 작은 Box와 Text)

@Composable
fun BoxExample0() {
Box(
modifier = Modifier
.background(color = Color.Blue)
.size(150.dp, 200.dp)
) {
Box(
modifier = Modifier
.background(color = Color.Green)
.size(100.dp, 100.dp)
){
}
Text(
text = "Hello",
style = MaterialTheme.typography.h5,
modifier = Modifier
.background(color = Color.White)
.size(70.dp, 50.dp)
)
}
}

지금 이 프로젝트를 실행하면 자식 요소가 서로의 위에 쌓인 것을 볼 수 있습니다.

첫 번째 Box 안에 Box와 동일한 Layer상에 Text를 정의하였습니다.

 

 

Alignments를 사용하여 부모 상자 레이아웃의 다른 위치에 자식 요소를 배치할 수 있습니다.

 

여기에서 더 작은 상자에 대해 .align(Alignment.TopEnd)을 사용하여 TopEnd에 align을 하고 .align(Alignment.BottomCenter)를 사용하여 BottomCenter에 align을 하였습니다.

 

@Composable
fun BoxExample0() {
Box(
modifier = Modifier
.background(color = Color.Blue)
.size(150.dp, 200.dp)
) {
Box(
modifier = Modifier
.background(color = Color.Green)
.size(100.dp, 100.dp)
.align(Alignment.TopEnd)
){
}
Text(
text = "Hello",
style = MaterialTheme.typography.h5,
modifier = Modifier
.background(color = Color.White)
.size(70.dp, 50.dp)
.align(Alignment.BottomCenter)
)
}
}

위의 코드는 아래 결과를 제공합니다.

Green box가 TopEnd로 Align이 되어있고 Text는 파란 Box안에서 BottomCenter에 위치한 것을 알 수 있습니다.

 

Alignments of Child Elements of a Box.

box layout의 자식 요소는 9가지 다른 alignment를 가질 수 있습니다.

아래 composable function은 이를 보여주기 위해 만들어 졌습니다. 

@Composable
fun BoxExample2() {
Box(
modifier = Modifier
.background(color = Color.LightGray)
.fillMaxSize()
) {
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.TopStart),
text = "TopStart"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.TopCenter),
text = "TopCenter"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.TopEnd),
text = "TopEnd"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.CenterStart),
text = "CenterStart"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.Center),
text = "Center"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.CenterEnd),
text = "CenterEnd"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.BottomStart),
text = "BottomStart"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.BottomCenter),
text = "BottomCenter"
)
Text(
style = MaterialTheme.typography.h6,
modifier = Modifier
.background(Color.White)
.padding(10.dp)
.align(Alignment.BottomEnd),
text = "BottomEnd"
)
}
}

 

9가지 alignment가 모두 구현되어 있습니다.

 

Alignments of a box layout

Box Layout Code Example

다음은 Box의 실용적인 응용프로그램 입니다.

이 코드 샘플에서는 Box를 사용하여 이미지에 Text와 Button을 배치했습니다.

@Composable
fun BoxExample3() {
Box() {
Image(
painter = painterResource(id = R.drawable.cat),
contentDescription = "cat"
)
Text(
text = "Cat",
style = MaterialTheme.typography.h4,
color = Color.Black,
modifier = Modifier
.align(Alignment.BottomStart)
)
Button(
onClick = {},
colors = ButtonDefaults.textButtonColors(
backgroundColor = Color.White,
contentColor = Color.DarkGray
),
modifier = Modifier
.align(Alignment.TopEnd)
.padding(10.dp)
.border(5.dp, Color.DarkGray, RectangleShape)
) {
Text("Feed To Cat")
}
}
}

Box안에 Image()를 호출하여 그림을 넣을 수 있습니다. painter = painterResource(id = R.drawable.cat)을 통해 이미지를 넣습니다.

Button도 넣을 수 있는데 여기서는 TopEnd에 집어넣고 border는 5.dp, DarkGray의 RectangleShape를 만듭니다. Button 주변에 검은색 border가 있는 것을 볼 수 있습니다.

 

 

이 것으로 Box Layout에 대한 설명을 마치겠습니다.

https://appdevnotes.com/box-layout-in-jetpack-compose/

 

300x250

댓글