현재 온도 옆에 있는 새로 고침 아이콘 버튼을 클릭해 보자. 앱이 최신 날씨 정보를 로드를 시작(하는 척) 한다. 로딩이 완료될 때까지 회색 원과 막대인 로딩 인디케이터가 나타난다. 이 인디케이터 알파 값(투명도) 애니메이션을 적용하여 프로세스가 진행 중임을 더 명확하게 표시해 보자.

c2912ddc2d73bdfc.png

LoadingRow 컴포저블에서 TODO 5를 찾자.

val alpha = 1f

이 값을 0f와 1f 사이에서 반복적으로 움직이게 만들고 싶다. 이를 위해 InfiniteTransition을 사용할 수 있다. 이 API는 이전 섹션의 Transition API와 유사하다. 둘 다 여러 값에 애니메이션을 적용하지만, Transition은 상태 변경에 따라 값에 애니메이션을 적용하는 반면, InfiniteTransition은 값에 무기한 애니메이션을 적용한다.

InfiniteTransition을 생성하려면 RememberInfiniteTransition 함수를 사용하자. 그런 다음 각 애니메이션 값 변경은 InfiniteTransition의 animate* 확장 함수 중 하나로 선언될 수 있다. 이 경우 알파 값에 애니메이션을 적용하므로 animationFloat를 사용해보겠다. initialValue 매개변수는 0f여야 하고, targetValue는 1f이여야 한다. 이 애니메이션에 AnimationSpec을 지정할 수도 있지만, 이 API는 InfiniteRepeatableSpec만 사용한다. 이를 하나 생성하기 위해 InfinityRepeatable 함수를 사용한다. 이 AnimationSpec은 시간(duration) 기반으로 AnimationSpec을 래핑하고 반복 가능하게 만든다. 예를 들어 결과 코드는 다음과 같아야 한다.

val infiniteTransition = rememberInfiniteTransition()
val alpha by infiniteTransition.animateFloat(
    initialValue = 0f,
    targetValue = 1f,
    animationSpec = infiniteRepeatable(
        animation = keyframes {
            durationMillis = 1000
            0.7f at 500
        },
        repeatMode = RepeatMode.Reverse
    )
)

앱을 실행하고 새로 고침 버튼을 클릭해 보자. 이제 로딩 인디케이터가 움직이는 것을 볼 수 있다.

ca4d1d5bfe87b2a9.gif
카테고리: Compose

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.