FlowRow
및 FlowColumn
는 Row
및 Column
와 유사한 컴포저블이지만 컨테이너의 공간이 부족하면 항목이 다음 줄로 이동한다는 점에서 다릅니다. 이렇게 하면 여러 행 또는 열이 생성됩니다. maxItemsInEachRow
또는 maxItemsInEachColumn
를 설정하여 선의 항목 수를 제어할 수도 있습니다. FlowRow
및 FlowColumn
를 사용하여 반응형 레이아웃을 빌드하는 경우가 많습니다. 항목이 한 측정기준에 비해 너무 크더라도 콘텐츠가 잘리지 않으며, maxItemsInEach*
와 Modifier.weight(weight)
를 함께 사용하면 필요한 경우 행 또는 열의 너비를 채우거나 확장하는 레이아웃을 빌드하는 데 도움이 됩니다.
칩 또는 필터링 UI가 일반적인 예입니다.
기본 사용법
FlowRow
또는 FlowColumn
를 사용하려면 이러한 컴포저블을 만들고 표준 흐름을 따라야 하는 항목을 그 안에 배치합니다.
@Composable private fun FlowRowSimpleUsageExample() { FlowRow(modifier = Modifier.padding(8.dp)) { ChipItem("Price: High to Low") ChipItem("Avg rating: 4+") ChipItem("Free breakfast") ChipItem("Free cancellation") ChipItem("£50 pn") } }
이 스니펫을 사용하면 위와 같은 UI가 생성되며, 첫 번째 행에 더 이상 공간이 없으면 항목이 다음 행으로 자동으로 이동합니다.
흐름 레이아웃의 기능
흐름 레이아웃에는 앱에서 다양한 레이아웃을 만드는 데 사용할 수 있는 다음과 같은 기능과 속성이 있습니다.
기본축 정렬: 가로 또는 세로 정렬
기본축은 항목이 배치되는 축입니다 (예: FlowRow
에서 항목은 가로로 정렬됨). FlowRow
의 horizontalArrangement
매개변수는 여유 공간이 항목 간에 배포되는 방식을 제어합니다.
다음 표는 FlowRow
의 항목에 horizontalArrangement
를 설정하는 예를 보여줍니다.
가로 정렬이 |
결과 |
|
|
FlowColumn
의 경우 verticalArrangement
에서 유사한 옵션을 사용할 수 있으며 기본값은 Arrangement.Top
입니다.
교차축 정렬
교차축은 기본 축과 반대 방향의 축입니다. 예를 들어 FlowRow
에서는 세로축입니다. 컨테이너 내의 전체 콘텐츠가 교차 축에 정렬되는 방식을 변경하려면 FlowRow
에 verticalArrangement
를, FlowColumn
에 horizontalArrangement
를 사용합니다.
FlowRow
의 경우 다음 표는 항목에 서로 다른 verticalArrangement
를 설정하는 예를 보여줍니다.
|
결과 |
|
|
FlowColumn
의 경우 horizontalArrangement
에서 유사한 옵션을 사용할 수 있습니다.
기본 교차 축 배열은 Arrangement.Start
입니다.
개별 항목 정렬
행 내에서 개별 항목을 다른 정렬로 배치할 수 있습니다. 이는 현재 줄 내에서 항목을 정렬하므로 verticalArrangement
및 horizontalArrangement
와는 다릅니다. Modifier.align()
를 사용하여 적용할 수 있습니다.
예를 들어 FlowRow
의 항목 높이가 다른 경우 행은 가장 큰 항목의 높이를 가져와 항목에 Modifier.align(alignmentOption)
를 적용합니다.
|
결과 |
|
|
FlowColumn
의 경우 유사한 옵션을 사용할 수 있습니다. 기본 정렬은 Alignment.Start
입니다.
행 또는 열의 최대 항목 수
매개변수 maxItemsInEachRow
또는 maxItemsInEachColumn
는 다음으로 래핑하기 전에 한 줄에 허용되는 기본 축의 최대 항목을 정의합니다. 기본값은 Int.MAX_INT
이며, 크기가 줄에 맞을 수 있는 한 최대한 많은 항목을 허용합니다.
예를 들어 maxItemsInEachRow
를 설정하면 초기 레이아웃에 항목이 3개만 있게 됩니다.
최대값 설정 안함 |
|
흐름 항목 지연 로드
ContextualFlowRow
및 ContextualFlowColumn
는 흐름 행 또는 열의 콘텐츠를 지연 로드할 수 있는 FlowRow
및 FlowColumn
의 특수 버전입니다. 또한 항목이 첫 번째 행에 있는지 여부와 같은 항목 위치(색인, 행 번호, 사용 가능한 크기)에 관한 정보도 제공합니다. 이는 대규모 데이터 세트와 항목에 관한 문맥 정보가 필요한 경우에 유용합니다.
maxLines
매개변수는 표시되는 행 수를 제한하고 overflow
매개변수는 항목 오버플로에 도달할 때 표시할 항목을 지정하여 맞춤 expandIndicator
또는 collapseIndicator
를 지정할 수 있습니다.
예를 들어 '+ (남은 항목 수)' 또는 '더 적게 표시' 버튼을 표시하려면 다음을 실행합니다.
val totalCount = 40 var maxLines by remember { mutableStateOf(2) } val moreOrCollapseIndicator = @Composable { scope: ContextualFlowRowOverflowScope -> val remainingItems = totalCount - scope.shownItemCount ChipItem(if (remainingItems == 0) "Less" else "+$remainingItems", onClick = { if (remainingItems == 0) { maxLines = 2 } else { maxLines += 5 } }) } ContextualFlowRow( modifier = Modifier .safeDrawingPadding() .fillMaxWidth(1f) .padding(16.dp) .wrapContentHeight(align = Alignment.Top) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(4.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), maxLines = maxLines, overflow = ContextualFlowRowOverflow.expandOrCollapseIndicator( minRowsToShowCollapse = 4, expandIndicator = moreOrCollapseIndicator, collapseIndicator = moreOrCollapseIndicator ), itemCount = totalCount ) { index -> ChipItem("Item $index") }
상품 중량
두께는 계수와 배치된 선의 사용 가능한 공간을 기준으로 항목을 늘립니다. 중요한 점은 FlowRow
와 Row
의 차이점은 가중치를 사용하여 항목의 너비를 계산하는 방법에 있습니다. Rows
의 경우 중량은 Row
의 모든 항목을 기준으로 합니다. FlowRow
의 경우 가중치는 FlowRow
컨테이너의 모든 항목이 아닌 항목이 배치된 행의 항목을 기준으로 합니다.
예를 들어 모두 한 줄에 표시되는 항목 4개가 있고 각 항목의 가중치가 1f, 2f, 1f
와 3f
로 다르다면 총 가중치는 7f
입니다. 행 또는 열의 나머지 공간은 7f
로 나뉩니다. 그런 다음 각 항목 너비는 weight * (remainingSpace / totalWeight)
를 사용하여 계산됩니다.
Modifier.weight
및 최대 항목을 FlowRow
또는 FlowColumn
와 함께 사용하여 그리드와 같은 레이아웃을 만들 수 있습니다. 이 접근 방식은 기기 크기에 맞게 조정되는 반응형 레이아웃을 만드는 데 유용합니다.
가중치를 사용하여 얻을 수 있는 결과의 몇 가지 예가 있습니다. 한 가지 예는 아래와 같이 항목 크기가 동일한 그리드입니다.
동일한 상품 크기의 그리드를 만들려면 다음 단계를 따르세요.
val rows = 3 val columns = 3 FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = rows ) { val itemModifier = Modifier .padding(4.dp) .height(80.dp) .weight(1f) .clip(RoundedCornerShape(8.dp)) .background(MaterialColors.Blue200) repeat(rows * columns) { Spacer(modifier = itemModifier) } }
중요한 점은 항목을 하나 더 추가하고 9번 대신 10번 반복하면 전체 행의 총 가중치가 1f
이므로 마지막 항목이 전체 마지막 열을 차지한다는 것입니다.
가중치를 Modifier.width(exactDpAmount), Modifier.aspectRatio(aspectRatio)
또는 Modifier.fillMaxWidth(fraction)
와 같은 다른 Modifiers
와 결합할 수 있습니다. 이러한 수식어는 모두 함께 작동하여 FlowRow
(또는 FlowColumn
) 내에서 항목의 반응형 크기 조절을 허용합니다.
두 개의 항목이 각각 너비의 절반을 차지하고 하나의 항목이 다음 열의 전체 너비를 차지하는 등 다양한 항목 크기로 교체되는 그리드를 만들 수도 있습니다.
다음 코드를 사용하여 이를 실행할 수 있습니다.
FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = 2 ) { val itemModifier = Modifier .padding(4.dp) .height(80.dp) .clip(RoundedCornerShape(8.dp)) .background(Color.Blue) repeat(6) { item -> // if the item is the third item, don't use weight modifier, but rather fillMaxWidth if ((item + 1) % 3 == 0) { Spacer(modifier = itemModifier.fillMaxWidth()) } else { Spacer(modifier = itemModifier.weight(0.5f)) } } }
비율 크기 조정
Modifier.fillMaxWidth(fraction)
를 사용하여 항목이 차지해야 하는 컨테이너의 크기를 지정할 수 있습니다. 이는 Row
또는 Column
에 적용될 때 Modifier.fillMaxWidth(fraction)
가 작동하는 방식과 다릅니다. Row/Column
항목은 전체 컨테이너 너비가 아니라 나머지 너비의 비율을 차지합니다.
예를 들어 다음 코드는 FlowRow
을 사용할 때와 Row
을 사용할 때 다른 결과를 생성합니다.
FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = 3 ) { val itemModifier = Modifier .clip(RoundedCornerShape(8.dp)) Box( modifier = itemModifier .height(200.dp) .width(60.dp) .background(Color.Red) ) Box( modifier = itemModifier .height(200.dp) .fillMaxWidth(0.7f) .background(Color.Blue) ) Box( modifier = itemModifier .height(200.dp) .weight(1f) .background(Color.Magenta) ) }
|
|
|
fillMaxColumnWidth()
및 fillMaxRowHeight()
FlowColumn
또는 FlowRow
내의 항목에 Modifier.fillMaxColumnWidth()
또는 Modifier.fillMaxRowHeight()
를 적용하면 동일한 열 또는 행의 항목이 열/행의 가장 큰 항목과 동일한 너비 또는 높이를 차지합니다.
예를 들어 이 예에서는 FlowColumn
를 사용하여 Android 디저트 목록을 표시합니다. Modifier.fillMaxColumnWidth()
가 항목에 적용된 경우와 적용되지 않고 항목이 줄바꿈된 경우 각 항목의 너비 차이를 확인할 수 있습니다.
FlowColumn( Modifier .padding(20.dp) .fillMaxHeight() .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp), maxItemsInEachColumn = 5, ) { repeat(listDesserts.size) { Box( Modifier .fillMaxColumnWidth() .border(1.dp, Color.DarkGray, RoundedCornerShape(8.dp)) .padding(8.dp) ) { Text( text = listDesserts[it], fontSize = 18.sp, modifier = Modifier.padding(3.dp) ) } } }
각 항목에 적용된 |
|
너비 변경사항이 설정되지 않음 (항목 래핑) |
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- Compose 레이아웃 기본사항
- Compose의 ConstraintLayout
- 편집기 작업 {:#editor-actions}