안드로이드 학습(Kotlin)

17. Android Animation (Property Animation)

리저브콜드브루 2025. 2. 4. 16:22
728x90
반응형

사용가능한 애니메이션 종류는 3가지이지만 이 글에서는 Property에 대해 주로 다룰 예정

 

Property Animation vs View Animation vs Drawable Animation

기능 비교 Property Animation (권장) View Animation (레거시) Drawable Animation (특수 목적)
적용 대상 View 및 데이터 객체 View의 트랜지션 효과 이미지 프레임 애니메이션
성능 최적화 하드웨어 가속 지원 제한적 지원 비효율적인 메모리 사용 가능성
속성 변경 여부 실제 속성 변경 가능 UI에만 적용 (실제 속성은 그대로) 단순한 이미지 전환만 지원
확장성 & 유연성 다양한 속성 조작 가능 제한적 (이동, 회전, 투명도 등만 지원) 이미지 기반으로 기능 제한
애니메이션 조합 AnimatorSet으로 복합 애니메이션 지원 기본 API로는 조합 어려움 이미지 프레임 조합만 가능

 

https://developer.android.com/develop/ui/views/animations/overview?hl=ko

 

애니메이션 소개  |  Views  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 애니메이션 소개 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose 사용해 보기 Jetpack Compose는 Andro

developer.android.com


Property Animation

  • View의 실제 속성(위치, 크기, 투명도, 회전 등)을 변경하여 애니메이션을 구현
  • Android 3.0 (API 11) 이상에서 도입된 공식 권장 애니메이션 방식
  • 뷰뿐만 아니라 데이터 객체에도 적용 가능

 

Property Animation의 핵심 클래스

1. ObjectAnimator

  • 특정 View의 속성을 직접 변경하는 가장 기본적인 클래스
  • 뷰의 alpha, translationX, rotation, scaleX 등의 속성에 애니메이션 적용 가능
val animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)
animator.duration = 1000  // 1초 동안 애니메이션 실행
animator.start()
  • "alpha": 투명도 속성을 0(투명) → 1(불투명)으로 변경
  • duration: 애니메이션 실행 시간 설정
  • start(): 애니메이션 시작

2. ValueAnimator

  • 속성에 국한되지 않고 값 자체를 변화시킬 수 있는 클래스
  • 숫자 애니메이션, 진행률 표시, 커스텀 속성 애니메이션에 활용 가능
val animator = ValueAnimator.ofInt(0, 100)
animator.duration = 2000

animator.addUpdateListener { valueAnimator ->
    val value = valueAnimator.animatedValue as Int
    textView.text = "$value%"
}

animator.start()
  • animatedValue로 현재 애니메이션 진행 중인 값을 얻어와 UI에 반영
  • 숫자 증가 애니메이션 구현 가능

3. AnimatorSet

  • 여러 개의 애니메이션을 동시에 또는 순차적으로 실행하는 클래스
  • 복합적인 애니메이션 효과를 만들 때 유용
val fadeIn = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f)
val moveRight = ObjectAnimator.ofFloat(view, "translationX", 0f, 300f)
val rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f)

val animatorSet = AnimatorSet()
animatorSet.playTogether(fadeIn, moveRight, rotate) // 동시에 실행
animatorSet.duration = 2000
animatorSet.start()
  • playTogether(): 여러 애니메이션을 동시에 실행
  • playSequentially(): 애니메이션을 순차적으로 실행

4. TimeInterpolator

  • 애니메이션의 속도 변화를 제어하는 클래스
  • 애니메이션의 가속도, 감속도, 반복 속도 등을 조절
val animator = ObjectAnimator.ofFloat(view, "translationY", 0f, 300f)
animator.duration = 1500
animator.interpolator = BounceInterpolator()  // 튕기는 효과
animator.start()
Interpolator 종류 설명
LinearInterpolator 일정한 속도로 애니메이션 진행
AccelerateInterpolator 점점 빨라지는 효과
DecelerateInterpolator 점점 느려지는 효과
BounceInterpolator 튕기는 듯한 애니메이션 효과
OvershootInterpolator 목표 지점을 살짝 넘어갔다가 돌아오는 효과

주요 애니메이션 속성

속성 설명
alpha 투명도 (0 = 투명, 1 = 불투명)
translationX/Y X, Y 축으로 이동
rotation 회전 (도 단위)
scaleX/Y X, Y 축으로 크기 확대/축소
x, y 뷰의 좌표 위치 변경
backgroundColor 배경 색상 변경

 

속성을 적절히 활용하여 페이드 인, 수직 또는 수평 이동, 회전, 색 변화 효과들을 만들 수 있다.


반복 애니메이션 설정

val animator = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f)
animator.duration = 2000
animator.repeatCount = ValueAnimator.INFINITE  // 무한 반복
animator.repeatMode = ValueAnimator.REVERSE    // 반대로 반복
animator.start()
  • repeatCount = INFINITE: 무한 반복
  • repeatMode = REVERSE: 되감기 효과로 반대로 반복

애니메이션 리스너 추가

애니메이션의 시작, 종료, 반복 등의 이벤트를 감지할 수 있다.

animator.addListener(object : Animator.AnimatorListener {
    override fun onAnimationStart(animation: Animator) {
        Log.d("Animation", "애니메이션 시작")
    }

    override fun onAnimationEnd(animation: Animator) {
        Log.d("Animation", "애니메이션 종료")
    }

    override fun onAnimationCancel(animation: Animator) {
        Log.d("Animation", "애니메이션 취소됨")
    }

    override fun onAnimationRepeat(animation: Animator) {
        Log.d("Animation", "애니메이션 반복 중")
    }
})

애니메이션 최적화 및 팁

  • 애니메이션이 상태 관리: 애니메이션이 이미 실행 중인지 확인하고 중복 방지
    if (!animator.isRunning) {
        animator.start()
    }
  • 하드웨어 가속 활용: 애니메이션 성능을 최적화하기 위해 하드웨어 가속 활성화
    <application android:hardwareAccelerated="true" ... />
  • OverDraw 최소화: 중복된 그리기를 방지하여 렌더링 성능 최적화
  • RecyclerView 최적화: 리스트 스크롤 시 애니메이션 성능 저하 방지를 위해 pauseRequest() 사용

 

728x90
반응형