Composable 함수 기본사항
컴포저블 함수는 UI의 일부를 설명하는 Unit을 내보내는 함수이다.
정렬 방식에 관한 가이드가 없으면 Unit을 서로 겹치게 표시한다.
예시
@Composable
fun ArtistCard() {
Text("Alfred Sisley")
Text("3 minutes ago")
}
위 코드는 텍스트 요소를 서로 겹치게 표시한다.
Compose는 UI요소를 정렬하기위한 레이아웃 컬렉션을 제공한다.
표준 레이아웃
Column
화면에 세로로 배치한다.
Column 내에서 하위 요소의 위치를 설정하려면 verticalArrangement 및 horizontalAlignment를 설정하면 된다.
예시
@Composable
fun ArtistCard() {
Column {
Text("Alfred Sisley")
Text("3 minutes ago")
}
}
Row
화면에 가로로 배치한다.
Column, Row는 함께 섞어서 쓸 수 있다.
Row 내에서 하위 요소의 위치를 설정하려면 horizontalArrangement와 verticalAlignment를 설정하면 된다.
예시
@Composable
fun ArtistCard(artist: Artist) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End
) {
Image(/*...*/)
Column {
Text(artist.name)
Text(artist.lastSeenOnline)
}
}
}
Box
Box는 요소를 다른 요소 위에 놓는다.
포함된 요소의 특정 정렬 구성도 지원한다.
예시
@Composable
fun ArtistAvatar(artist: Artist) {
Box {
Image(/*...*/)
Icon(/*...*/)
}
}
레이아웃 모델
레이아웃 모델에서 UI트리는 단일 패스로 배치된다.
- 각 노드는 먼저 자체 측정을 요청받는다.
- 하위 요소를 반복적으로 측정한다.
- 크기 제약 조건을 트리 아래 하위 요소로 전달한다.
- 리프노드가 크기 지정 및 배치된다.
- 확인된 크기 및 배치 안내는 다시 트리 위로 전달된다.
→ 상위 요소는 하위 요소보다 먼저 측정되지만 크기와 위치는 하위 요소 다음에 지정된다.
예시)
@Composable
fun SearchResult(...) {
Row(...) {
Image(...)
Column(...) {
Text(...)
Text(..)
}
}
}
이 함수는 다음과 같은 UI 트리를 생성한다.
SearchResult
Row
Image
Column
Text
Text
- 루트 노드 Row에 즉정을 요청
- 루트 노드 Row는 첫번째 하위 요소 Image에 측정을 요청
- Image는 리프노드가 없으므로 크기를 보고하고 배치 안내를 반환
- 루트노드 Row는 두번째 하위 요소 Column에 측정을 요청
- Column노드는 첫번째 하위요소 Text에 측정을 요청
- 첫번째 Text노드는 리프노드이므로 크기를 보고하고 배치 안내를 반환
- Column노드가 하위 요소를 측정하여 크기를 지정하고 배치했으므로 자체 크기와 배치를 결정할 수 있음
- 루트노드 Row가 하위 요소를 측정하여 크기를 지정하고 배치했으므로 자체 크기와 배치를 결정할 수 있음
성능
- Compose는 하위 요소를 한 번만 측정하여 높은 성능을 발휘한다.요소가 하위 요소를 두 번 측정한 후 하위 요소가 각각의 하위 요소가 각각의 자체 하위 요소를 두 번 측정하는 방식은 전체 UI를 배치하려는 한 번의 시도에서 많은 작업을 실행해야 하므로 앱의 성능을 유지하기 어렵다.
- 레이아웃에서 여러 측정이 필요하면 Compose는 내장 측정 기능을 제공한다. (다른 페이지에서 설명!)
- 단일 패스 측정은 성능 측면에서 효율적이므로 Compose가 깊은 UI트리를 효율적으로 처리할 수 있다.
- 측정과 배치는 레이아웃 패스의 별개 하위 단계이므로, 항목의 측정이 아닌 배치에만 영향을 미치는 모든 변경사항은 별도로 실행할 수 있다.
반응형
'Android > Compose' 카테고리의 다른 글
Compose의 상태 - Flow, LiveData (0) | 2023.11.29 |
---|---|
Compose의 상태 - 호이스팅이란? (0) | 2023.11.02 |
Compose의 상태 (0) | 2023.11.02 |
Compose 이해 (0) | 2023.10.26 |