View Animation은 Tween Animation(Alpha, Translate, Scale, Rotate)을 통해 View 객체로 작동하는 Android API 1+의 레거시 애니메이션 시스템입니다. Google은 모든 새 프로젝트에 Property Animation(Animator)을 권장합니다. 이 문서는 원리, 유형, XML 마크업 및 폐기 이유를 설명합니다.
주요 내용
View Animation은 View 수준(API 1+)에서 작동하는 Android의 애니메이션 하위 시스템입니다. AlphaAnimation(투명도), TranslateAnimation(이동), ScaleAnimation(크기 조정), RotateAnimation(회전)의 네 가지 Tween Animation 유형을 사용합니다. 각 애니메이션은 res/anim/ 폴더의 XML 파일에 설명되거나 Kotlin 코드에서 프로그래밍 방식으로 생성됩니다.
View Animation 메커니즘은 View의 실제 속성을 변경하지 않습니다 — 새 위치, 크기 또는 투명도로 View를 다시 그리지만 onTouchEvent() 콜백은 원래 위치의 좌표를 수신합니다. 이것이 클릭 불일치(click mismatch)로 알려진 주요 제한 사항입니다.
Android 개발자 문서(2026)에 따르면 Google은 Android 3.0(API 11)부터 View Animation을 더 이상 사용되지 않는 API로 표시했습니다. 새 프로젝트에는 setter 메서드를 통해 실제 객체 속성으로 작동하는 Property Animation(Animator, AnimatorSet, ObjectAnimator)이 권장됩니다.
Tween Animation은 키프레임 “사이”의 애니메이션입니다: 시작 및 종료 상태를 정의하면 시스템이 중간 프레임을 계산합니다. Android는 각각 고유한 매개변수 세트가 있는 네 가지 표준 유형을 제공합니다.
AlphaAnimation은 View의 투명도를 fromAlpha에서 toAlpha까지 변경합니다. 값은 0.0(완전 투명)에서 1.0(완전 표시)까지입니다. 기본적으로 애니메이션은 300ms 동안 지속됩니다. fillAfter=true 매개변수는 View를 최종 투명도 상태로 유지합니다.
<!-- res/anim/fade_out.xml -->
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"
android:fillAfter="true" />TranslateAnimation은 View를 시작 위치(fromXDelta, fromYDelta)에서 끝 위치(toXDelta, toYDelta)로 이동합니다. 값은 픽셀, 부모의 백분율 또는 View 자체의 백분율로 지정됩니다. 예를 들어 100%는 View 너비의 100%를 의미합니다.
ScaleAnimation은 pivotX/pivotY 지점을 기준으로 View의 크기를 조정합니다. fromXScale=1.0, toXScale=2.0은 너비를 두 배로 만듭니다. pivotType 매개변수는 피벗이 무엇을 기준으로 계산되는지 결정합니다: self, parent 또는 absolute. 크기 조정 애니메이션은 View의 실제 치수를 변경하지 않고 렌더링만 변경합니다.
RotateAnimation은 View를 피벗 지점을 중심으로 fromDegrees에서 toDegrees까지의 각도로 회전합니다. 각도는 도 단위로 측정됩니다: 0은 원래 위치, 360은 완전 회전입니다. 무한 회전의 경우 repeatCount=INFINITE를 사용하세요.
View Animation과 Property Animation(Animator)의 차이는 Android 애니메이션 아키텍처의 근본적인 차이입니다. View Animation은 렌더링에서만 작동하는 반면, Property Animation은 setter 메서드를 통해 실제 객체 속성을 변경하여 레이아웃 업데이트를 유발합니다.
| 기준 | View Animation | Property Animation |
|---|---|---|
| API 수준 | API 1+(더 이상 사용되지 않음) | API 11+(권장) |
| 애니메이션 대상 | View 렌더링(canvas) | 객체 속성(setter) |
| 애니메이션 후 클릭 | 원래 위치 | 새 위치 |
| 애니메이션 유형 | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | 변경하지 않음 | setLayoutParams를 통해 변경 |
| 성능 | 높음(canvas만) | 중간(setter에 따라 다름) |
View Animation은 일반적으로 res/anim/의 XML 파일에서 루트 요소
<!-- res/anim/bounce.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator">
<translate
android:fromYDelta="0%"
android:toYDelta="-100%"
android:duration="600" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.3"
android:duration="600" />
</set>XML 파일은 AnimationUtils.loadAnimation()을 통해 로드됩니다. Interpolator는 시간에 따라 매개변수가 어떻게 변하는지 정의합니다: accelerate, decelerate, bounce, overshoot. 사용자 정의 Interpolator는 XML 리소스 @anim/interpolator_name을 통해 생성됩니다.
모든 Tween 애니메이션은 속성을 지원합니다: duration(ms), startOffset(시작 전 지연), repeatCount, repeatMode(restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. fillAfter 속성은 완료 후 View가 애니메이션의 최종 상태를 유지할지 여부를 결정합니다.
애니메이션은 일반적으로 XML에서 정의되지만 Kotlin을 사용하여 프로그래밍 방식으로도 만들 수 있습니다. 프로그래밍 방식 접근은 동적 매개변수에 유용합니다: 투명도 값은 정적으로 정의되지 않고 애플리케이션 상태에 따라 달라집니다.
// Kotlin에서 프로그래밍 방식으로 AlphaAnimation 생성
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.view.View
fun View.fadeOut(duration: Long = 500L, onEnd: () -> Unit = {}) {
val animation = AlphaAnimation(1.0f, 0.0f).apply {
this.duration = duration
fillAfter = true
setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationEnd(animation: Animation?) { onEnd() }
override fun onAnimationStart(animation: Animation?) {}
override fun onAnimationRepeat(animation: Animation?) {}
})
}
startAnimation(animation)
}
// XML에서 애니메이션 로드
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — 애니메이션 결합
val set = AnimationSet(true).apply {
addAnimation(TranslateAnimation(0f, 200f, 0f, 0f).apply { duration = 400 })
addAnimation(RotateAnimation(0f, 360f).apply {
duration = 400
pivotX = view.width / 2f
pivotY = view.height / 2f
})
}
view.startAnimation(set)startAnimation() 메서드는 View의 렌더링 큐에 애니메이션을 추가합니다. 취소하려면 clearAnimation()을 사용하세요. 중요: fillAfter=true는 LayoutParams를 변경하지 않습니다 — startAnimation이 다시 호출되면 마지막으로 렌더링된 상태가 아닌 View의 원래 상태에서 애니메이션이 시작됩니다.
View Animation은 2026년에 적용 범위가 좁습니다: Property Animation이 불안정하게 작동할 수 있는 Android 4.x(API 16-19) 지원; LayoutParams 변경이 필요하지 않은 간단한 나타나기/사라지기 효과; 클릭 불일치가 중요하지 않은 애니메이션(예: 배경 요소). 다른 모든 경우에는 Google이 ObjectAnimator 또는 AnimatorSet으로 전환할 것을 권장합니다.
Android Developers에 따르면 Property Animation은 중간 canvas 프레임을 생성하지 않기 때문에 메모리 효율성이 15-20% 더 높습니다. View Animation에서 Property Animation으로 전환하면 클릭 불일치 문제도 제거됩니다: 애니메이션 후 View는 새 위치에서 터치를 수신합니다.
자주 묻는 질문
View Animation은 View의 렌더링만 변경합니다 — 애니메이션 후 View는 터치 이벤트에 대해 원래 위치에 유지됩니다. Property Animation은 객체의 실제 속성을 변경하여 LayoutParams를 업데이트하고 새 위치에서 클릭을 올바르게 처리합니다.
Google은 Android 3.0(API 11)부터 View Animation을 더 이상 사용되지 않는 것으로 선언했습니다. 이유는 클릭 불일치(click mismatch)와 임의의 객체 속성을 애니메이션화할 수 없기 때문입니다. Property Animation은 이러한 문제를 해결하며 모든 새 프로젝트에 권장됩니다.
사용할 수 있지만 권장되지 않습니다. TranslateAnimation 후 버튼은 새 위치에 표시되지만 클릭은 원래 위치에 등록됩니다. 버튼의 경우 Property Animation 또는 Jetpack Compose에서 AnimatedVisibility가 있는 컴포저블을 사용하세요.
view.clearAnimation()을 호출하세요. fillAfter=true로 애니메이션이 시작된 경우 View는 최종 상태를 유지합니다. 원래 상태로 강제로 돌아가려면 clearAnimation()과 invalidate()를 호출하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.