2. Layouts, theming, and animation Deep dive into Compose Layouts 레이아웃 모델에 대해 자 세히 살펴보고 내부에서 작동하는 방식 등을 살펴 봅니다. Video Lazy layouts RecyclerView 보다 만들 기 쉬운 Compose Lazy Layout 리스트에 대해서 알아봅니다. Video Material Design Jetpack Compose의 상태 및 side effects API와 관련 된 고급 개념을 알아봅니 다. Video Animation Compose Animation Api 를 사용하는 방법을 알아 봅니다. 단순한 것 부터 고 급 애니메이션 까지 여러 가지 패턴을 볼 수 있습니 다. Codelab Link: https://developer.android.com/courses/pathways/jetpack-compose-for-android-developers-2
Link: https://developer.android.com/jetpack/compose/modifiers?hl=ko @Composable fun ArtistCard(/*...*/) { val padding = 16.dp Column( Modifier .clickable(onClick = onClick) .padding(padding) .fillMaxWidth() ) { // rest of the implementation } } Modifier 함수의 순서는 중요합니 다. 각 함수는 이전 함수에서 반 환한 Modifier를 변경하므로 순서 는 최종 결과에 영향을 줍니다.
값 변경 애니메이션 animate*AsState animate*AsState 함수는 Compose에서 단일 값 변경 애니메이 션 처리하는 가장 간단한 Animation API입니다. 최종 값(또는 타겟 값)만 제공하면 API가 현재 값에서 지정된 값으로 애니메 이션을 시작합니다. val backgroundColor by animateColorAsState( if (tabPage == TabPage.Home) Purple100 else Green300) ) Link: https://developer.android.com/jetpack/compose/animation?hl=ko
애니메이션 AnimatedVisibility 콘텐츠가 나타나고 사라지는 애니메이션 처리합니다. var editable by remember { mutableStateOf(true) } AnimatedVisibility(visible = editable) { Text(text = "Edit") } Link: https://developer.android.com/jetpack/compose/animation?hl=ko
크기 변경 애니메이션 var message by remember { mutableStateOf("Hello") } Box( modifier = Modifier.background(Color.Blue) .animateContentSize() ) { Text(text = message) } Link: https://developer.android.com/jetpack/compose/animation?hl=ko animateContentSize animateContentSize 수정자는 크기를 변경하는 애니메이션을 표시합 니다. Size() 또는 defaultMinSize() 앞에 배치
값 변경 애니메이션 enum class BoxState { Collapsed,Expanded } Link: https://developer.android.com/jetpack/compose/animation?hl=ko updateTransition Transition은 하나 이상의 애니메이션을 하 위 요소로 관리하며 여러 상태 간에 동시 에 실행합니다. var currentState by remember { mutableStateOf(BoxState.Collapsed) } val transition = updateTransition(currentState) val borderWidth by transition.animateDp { state - > . . . }
(Repeating) 애니메이션 InfiniteTransition 반복적인 애니메이션 처리에 사용합니다. 이 API 는 Transition API 와 유사합니다. 둘 다 여러 값에 애니메이션을 적용하지만 Transition은 상태 변경 에 따라 값에 애니메이션을 한 번 적용하고, Infinite Transition은 값에 무기한으로 애니메이션 을 적용합니다. Link: https://developer.android.com/jetpack/compose/animation?hl=ko val infiniteTransition = rememberInfiniteTransition() val color by infiniteTransition.animateColor( initialValue = Color.Red, targetValue = Color.Green, animationSpec = infiniteRepeatable( animation = tween(1000, easing= LinearEasing), repeatMode = RepeatMode.Reverse ) ) Box(Modifier.fillMaxSize().background(color))
애니메이션 swipeToDismiss 사용자 터치 이벤트 애니메이션 먼저 사용자가 화면에 손가락을 대면 x 및 y 좌표 가 있는 터치 이벤트가 생성되고 손가락을 오른쪽 이나 왼쪽으로 이동하면 이동에 따라 x 및 y 좌표 도 이동합니다. 사용자가 터치하는 항목은 손가락 에 따라 이동해야 하므로, 터치 이벤트의 위치와 속도에 따라 항목의 위치가 업데이트된 값을 받아 오는 방법을 살펴봅니다. Link: https://developer.android.com/jetpack/compose/animation?hl=ko
Modifier.swipeToDismiss( onDismissed: () -> Unit ): Modifier = composed { val offsetX = remember { Animatable(0f) } pointerInput(Unit) { . . . } .offset { IntOffset(offsetX.value.roundToInt(), 0) } } pointerInput 수신되는 포인터 터치 이벤트에 대한 액세스 권한을 얻고 동일 한 포인터를 사용해서 사용자가 드래그 하는 속도를 추적할 수 있습니다. { } 안에서 설정된 애니메이션 값을 offset을 통해 element 에 적용해주면 제스처 또는 애니메 이션이 실행됩니다.