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
반응형
'안드로이드 학습(Kotlin)' 카테고리의 다른 글
FusedLocationProviderClient란? (1) | 2025.02.06 |
---|---|
LocationRequest란? (0) | 2025.02.06 |
16. Glide로 이미지 처리하기 (1) | 2025.02.04 |
15. ViewPager의 개념과 구조 (0) | 2025.02.04 |
14. RecyclerView와 Adapter, ViewHolder에 대해 (0) | 2025.02.04 |