0Pricing
Android Academy · 강의

애니메이션과 전환

ViewPropertyAnimator, ObjectAnimator, AnimatorSet으로 뷰에 애니메이션을 적용합니다. 프래그먼트 전환, 공유 요소 애니메이션, 스프링 물리 효과를 추가합니다.

애니메이션과 전환은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 5개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 5개의 강의가 포함되어 있습니다.

애니메이션이 중요한 이유

애니메이션은 앱을 생동감 있고 반응성 있게 만듭니다. 애니메이션은 다음과 같은 역할을 합니다.

  • 사용자 작업에 시각적 피드백 제공
  • 화면 간의 관계 표시
  • 데이터 변경을 덜 갑작스럽게 만들기
  • 무엇이 변경되었고 왜 변경되었는지 사용자가 이해하도록 지원

핵심 원칙은 애니메이션이 UI를 방해하지 않고 보조해야 한다는 것입니다. 300ms 이내로 유지하세요.

ViewPropertyAnimator — 빠른 애니메이션

뷰에 애니메이션을 적용하는 가장 간단한 방법입니다. 호출을 연결한 다음 start()를 호출합니다.

// Fade a view out:
binding.tvMessage
    .animate()
    .alpha(0f)
    .setDuration(300)
    .withEndAction { binding.tvMessage.visibility = View.GONE }
    .start()

// Slide in from bottom:
binding.cardView.translationY = 200f
binding.cardView.alpha = 0f
binding.cardView
    .animate()
    .translationY(0f)
    .alpha(1f)
    .setDuration(250)
    .setInterpolator(DecelerateInterpolator())
    .start()

ObjectAnimator

ObjectAnimator는 이름으로 모든 객체의 모든 속성에 애니메이션을 적용합니다. ViewPropertyAnimator보다 유연합니다.

// Rotate an image:
val rotateAnimator = ObjectAnimator.ofFloat(
    binding.ivLogo,
    "rotation",
    0f, 360f
).apply {
    duration = 600
    repeatCount = ObjectAnimator.INFINITE
    interpolator = LinearInterpolator()
    start()
}

// Stop it:
rotateAnimator.cancel()

AnimatorSet — 순차 및 병렬 실행

AnimatorSet은 여러 애니메이터를 함께 또는 차례로 실행하도록 조정합니다.

val fadeIn  = ObjectAnimator.ofFloat(binding.card, "alpha", 0f, 1f).setDuration(300)
val scaleX  = ObjectAnimator.ofFloat(binding.card, "scaleX", 0.8f, 1f).setDuration(300)
val scaleY  = ObjectAnimator.ofFloat(binding.card, "scaleY", 0.8f, 1f).setDuration(300)
val slideUp = ObjectAnimator.ofFloat(binding.card, "translationY", 100f, 0f).setDuration(300)

AnimatorSet().apply {
    // Run fadeIn + scaleX + scaleY together, then slideUp
    play(fadeIn).with(scaleX).with(scaleY)
    play(slideUp).after(fadeIn)
    interpolator = DecelerateInterpolator()
    start()
}

보간기

보간기는 애니메이션의 변화 속도를 제어합니다. 일반적으로 사용하는 보간기는 다음과 같습니다.

  • LinearInterpolator — 일정한 속도
  • AccelerateInterpolator — 느리게 시작해 빨라짐(화면에서 나갈 때)
  • DecelerateInterpolator — 빠르게 시작해 느려짐(화면에 들어올 때)
  • AccelerateDecelerateInterpolator — 느림 → 빠름 → 느림(기본값)
  • OvershootInterpolator — 목표를 지나쳤다가 되돌아옴
  • BounceInterpolator — 끝에서 튕김

TransitionManager — 레이아웃 변경

가시성이나 레이아웃 속성을 변경하기 전에 TransitionManager.beginDelayedTransition()을 호출하면 레이아웃 변경에 자동으로 애니메이션을 적용할 수 있습니다.

binding.btnToggle.setOnClickListener {
    // Tell the framework to animate the next layout change
    TransitionManager.beginDelayedTransition(
        binding.root,
        ChangeBounds().apply { duration = 300 }
    )

    // Now change visibility/size — Android animates the difference automatically
    binding.expandedSection.visibility =
        if (binding.expandedSection.isVisible) View.GONE else View.VISIBLE
}

Fragment 전환

Fragment 트랜잭션에 진입/종료 애니메이션을 추가합니다.

supportFragmentManager.beginTransaction()
    .setCustomAnimations(
        R.anim.slide_in_right,   // enterAnim
        R.anim.slide_out_left,   // exitAnim
        R.anim.slide_in_left,    // popEnterAnim
        R.anim.slide_out_right   // popExitAnim
    )
    .replace(R.id.container, DetailFragment())
    .addToBackStack(null)
    .commit()

// Or use MaterialSharedAxis for a modern, Material Motion feel:
val forward = MaterialSharedAxis(MaterialSharedAxis.X, true)
exitTransition = forward
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)

공유 요소 전환

두 화면에서 뷰를 공유하면 한 위치에서 다른 위치로 이동하는 애니메이션을 적용할 수 있습니다(예: 전체 이미지로 확대되는 썸네일).

// In ListFragment:
binding.ivThumbnail.transitionName = "hero_image_${item.id}"

val extras = FragmentNavigatorExtras(
    binding.ivThumbnail to "hero_image_${item.id}"
)
findNavController().navigate(R.id.action_list_to_detail, null, null, extras)

// In DetailFragment:
sharedElementEnterTransition = TransitionInflater
    .from(requireContext())
    .inflateTransition(android.R.transition.move)

// ImageView in detail layout must have the same transitionName

스프링 애니메이션

스프링 애니메이션은 물리적인 용수철의 움직임을 시뮬레이션하므로 선형 애니메이션이나 감속 애니메이션보다 자연스럽게 느껴집니다.

implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'

// Spring animation on a button press:
val spring = SpringAnimation(binding.fabAdd, DynamicAnimation.SCALE_X, 1f).apply {
    spring = SpringForce(1f).apply {
        stiffness = SpringForce.STIFFNESS_MEDIUM
        dampingRatio = SpringForce.DAMPING_RATIO_LOW_BOUNCY
    }
}

binding.fabAdd.setOnClickListener {
    binding.fabAdd.scaleX = 0.8f
    spring.start()
}

Lottie — 복잡한 애니메이션

Lottie는 JSON으로 내보낸 After Effects 애니메이션을 재생합니다. 로딩 스피너, 온보딩 및 빈 상태에 적합합니다.

// app/build.gradle:
// implementation 'com.airbnb.android:lottie:6.4.0'

<!-- In layout XML -->
<com.airbnb.lottie.LottieAnimationView
    android:id="@+id/lottieView"
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:lottie_rawRes="@raw/loading_animation"
    app:lottie_autoPlay="true"
    app:lottie_loop="true" />

// Control in code:
binding.lottieView.playAnimation()
binding.lottieView.pauseAnimation()

애니메이션 모범 사례

부드럽고 접근성 높은 애니메이션을 위한 지침:

  • 대부분의 UI 애니메이션은 150~300ms로 설정합니다.
  • 항상 AnimatorUtils.areAnimatorsEnabled() 또는 Settings.System.ANIMATOR_DURATION_SCALE을 준수합니다.
  • 전정 기관 장애가 있는 사용자는 애니메이션을 비활성화할 수 있으므로 Reduce Motion 접근성 설정을 확인합니다.
  • 필요하지 않은 요소에는 애니메이션을 적용하지 마세요. 적을수록 좋습니다.
  • 저사양 기기에서 테스트합니다(애니메이션으로 프레임이 끊길 수 있습니다).

빠른 확인

화면에 들어오는 요소가 감속하며 안정되는 느낌을 주려면 어떤 보간기가 가장 적합할까요?

복습: 애니메이션 및 전환

부드러운 애니메이션으로 앱에 생동감을 더해 보세요:

  • view.animate() — 알파, 이동, 크기 조절, 회전을 빠르게 적용
  • ObjectAnimator — 모든 속성을 세밀하게 제어
  • AnimatorSet — 여러 애니메이터를 조율(with/after)
  • TransitionManager.beginDelayedTransition() — 레이아웃 변경을 자동으로 애니메이션 처리
  • 공유 요소 전환 — 화면 간 자연스러운 연속성 제공
  • Lottie — After Effects에서 만든 복잡한 JSON 애니메이션

다음: 여러 섹션으로 구성된 앱을 위한 하단 탐색과 탭입니다.

자주 묻는 질문

“애니메이션과 전환” 강의는 무료인가요?

네 — “애니메이션과 전환” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 5개의 강의가 포함되어 있습니다.

“애니메이션과 전환”에서 뭘 배우나요?

ViewPropertyAnimator, ObjectAnimator, AnimatorSet으로 뷰에 애니메이션을 적용합니다. 프래그먼트 전환, 공유 요소 애니메이션, 스프링 물리 효과를 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 5개 중 4번째 강의입니다.

“애니메이션과 전환” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Material Design 기초
  2. 테마와 스타일
  3. 사용자 지정 뷰
  4. 애니메이션과 전환
  5. 하단 탐색과 탭
← Android Academy(으)로 돌아가기