size
: 자신의 크기 지정 이때, 상위 요소에서 수신된 제약조건을 충족하지 않는 경우 적용되지 않음 → 해결하기 위해서는 **requiredSize**
를 사용해야 한다. (상위 요소 크기보다 requiredSize
가 우선됨)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))
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
// ...
)
// ...
}