아니 컴포즈는 레이아웃 관련해서 왜이렇게 많은것인가..!! 공식문서에 너무나 이쁘게 잘 정리되어 있지만, 공식문서만 보면 머리가 삥글삥글.. 이거 나만이래? 암튼.. 자주 쓰고 한번쯤 읽어보면 좋은 레이아웃 관련 정보들을 직접 사용해보고 필요한 것들 위주로 정리해보았다.
verticalArrangment
: 자식의 수직 방향 배치 조절horizontalAlignment
: 자식의 수평 방향 배치 조절verticalAlignment
: 자식의 수직 방향 배치 조절horizontalArrangement
: 자식의 수평 방향 배치 조절contentAlignment
로 수직 수평 정렬 방식 결정Box(contentAlignment = Alignment.BottomStart) {
Text("Hello")
Text("World")
}
Spacer(modifier = Modifier.heightIn(5.dp))
가능한 다른 옵션들은 여기에 있다. 필요할때 참고하자!
Compose 수정자 목록 | Jetpack Compose | Android Developers
size
: 자신의 크기 지정
이때, 상위 요소에서 수신된 제약조건을 충족하지 않는 경우 적용되지 않음 → 해결하기 위해서는 `**requiredSize**`를 사용해야 한다. (상위 요소 크기보다 `requiredSize`가 우선됨)
- 높이와 너비를 각각 지정하기 위해서 `height` 와 `width` 도 사용이 가능하다.
fillMaxWidth
: 컴포저블이 상위 요소로부터 부여받은 최대 너비를 채움
fillMaxSize
, fillMaxHeight
도 있다.wrapContenHight
, wrapContenWidth
도 있다.Box {
Text("Hello, World!", Modifier.wrapContentSize().background(Color.Gray))
}
Row(
modifier = Modifier.fillMaxWidth()
) {
Image(
modifier = Modifier.weight(2f)
)
Column(
modifier = Modifier.weight(1f)
) {
}
}
→ 요소들의 가로 비율이 이미지가 2, Column이 1 이다. 만약 상위 요소에 대해 차지하는 퍼센트 비율을 나타내기 위해서는 소수점 사용하면 됨!
height
: 높이를 고정해서 지정width
: 너비를 고정해서 지정Spacer(Modifier.heightIn(min = 8.dp, max = 24.dp))
IntrinsicSize.Min
: 자식 컴포넌트들 중 가장 작은 내재된 크기를 부모 컴포넌트의 크기로 설정Modifier.height(IntrinsicSize.Min)
은 부모 컴포넌트의 높이가 자식 컴포넌트들중 가장 작은 컴포넌트의 높이에 사용된다.IntrinsicSize.Max
: 자식 컴포넌트들 중 가장 큰 내재된 크기를 부모 컴포넌트의 크기로 설정Modifier.width(IntrinsicSize.Max)
은 부모 컴포넌트의 넓이가 자식 컴포넌트들중 가장 작은 컴포넌트의 넓이 사용된다.padding
: 요소 주위 공간 배치
paddingFromBaseline
: 레이아웃 상단에서 기준선까지 특정 거리가 유지되도록 기준선 위에서 패딩 추가
기준선이 명확한 Text요소에서 사용하는게 가장 좋다
Modifier.offset(x = 10.dp, y = 20.dp)
Modifier.offset(x = { 0.dp }, y = { dynamicYValue.dp })
// dynamicYValue는 수직 방향으로의 이동 거리를 결정하는 동적인 값이며, 프로그램의 상태나 사용자의 입력 등에 따라 변경
Center, TopCenter, BottomCenter, BottomEnd, BottomStart, CenterEnd, CenterStart, TopEnd, TotStart
Box(Modifier.size(100.dp, 100.dp)) {
Text("Hello", Modifier.align(Alignment.Center))
}
Modifier.align
: 단일 자식 컴포넌트를 부모 컨테이너 내에서 정렬할 때 사용 (자식에 선언)contentAlignment
(Box): Box
내의 모든 자식 컴포넌트를 동일한 방식으로 정렬할 때 사용horizontalAlignment
(Column) 및 verticalAlignment
(Row): 각각 Column
과 Row
내의 모든 자식 컴포넌트를 수평 또는 수직 방향으로 일관되게 정렬할 때 사용 Card(modifier = Modifier
.clip(RoundedCornerShape(15.dp)) //둥근 모서리 적용
Modifier.verticalScroll
을 사용하여 컴포넌트에 수직 스크롤 기능을 추가할 수 있다. 이를 위해 rememberScrollState()
를 함께 사용Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
}
Modifier.horizontalScroll
을 사용하여 컴포넌트에 수평 스크롤 기능을 추가할 수 있다.Row(modifier = Modifier.horizontalScroll(rememberScrollState())) {
// 스크롤 가능한 컨텐츠
Modifier.draggable
을 사용하여 컴포넌트를 드래그할 수 있다. 상태 관리와 드래그 방향 등을 설정해야한다.val state = rememberDraggableState { delta ->
// 드래그 이벤트 처리
}
Box(modifier = Modifier
.size(100.dp)
.draggable(state, Orientation.Horizontal))
val reusableModifier = Modifier
.fillMaxWidth()
.background(Color.Red)
.padding(12.dp)
// 공통으로 사용할 Modifier 재 할당 -> 색을 red에서 gray로 변경
// 아니면 위에처럼 체인 생성 없이 컴포저블 밖에 선언해서 공통으로 사용 가능 -> Lazy에서 유용
val reusableModifier = Modifier
.padding(12.dp)
.background(Color.Gray)
@Composable
fun LoadingWheelAnimation() {
val animatedState = animateFloatAsState(/*...*/)
LoadingWheel(
// No allocation, as we're just reusing the same instance
modifier = reusableModifier,
animatedState = animatedState
)
}
Column(/*...*/) {
val reusableItemModifier = Modifier
.padding(bottom = 12.dp)
// Align Modifier.Element requires a ColumnScope
.align(Alignment.CenterHorizontally)
.weight(1f)
Text1(
modifier = reusableItemModifier,
// ...
)
Text2(
modifier = reusableItemModifier
// ...
)
// ...
}
Modifier
(size
, fillMaxWidth
, fillMaxHeight
등)는 다른 Modifier
보다 먼저 적용하는 것이 좋다. 이렇게 하면, 크기 조정이 다른 스타일링(예: 패딩, 배경)에 영향을 주지 않는다.Modifier
(clickable
)는 가능한 패딩 적용 후에 사용하는 것이 좋다. 이렇게 함으로써 클릭 가능한 영역이 패딩을 포함하게 되어 사용자 경험이 개선된다.