View Animation — 무엇인가, Android의 Tween Animation

저자: IT Sectr 게시일: 2026-03-01 읽는 시간: 8 분

View Animation은 Tween Animation(Alpha, Translate, Scale, Rotate)을 통해 View 객체로 작동하는 Android API 1+의 레거시 애니메이션 시스템입니다. Google은 모든 새 프로젝트에 Property Animation(Animator)을 권장합니다. 이 문서는 원리, 유형, XML 마크업 및 폐기 이유를 설명합니다.

주요 내용

  • View Animation — Tween Animation을 통해 View 애니메이션화: Alpha, Translate, Scale, Rotate
  • XML 정의 — 애니메이션은 res/anim/에서 , , , 를 사용하여 설명됩니다
  • AnimationSet — 공통 매개변수로 하나의 세트에 여러 애니메이션을 결합
  • 제한 사항 — View Animation은 속성을 변경하지 않고 렌더링만 변경: View는 원래 위치에 유지
  • Property Animation — 실제 객체 속성으로 작동하는 최신 대체(Animator)

View Animation이란?

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의 유형

Tween Animation은 키프레임 “사이”의 애니메이션입니다: 시작 및 종료 상태를 정의하면 시스템이 중간 프레임을 계산합니다. Android는 각각 고유한 매개변수 세트가 있는 네 가지 표준 유형을 제공합니다.

AlphaAnimation

AlphaAnimation은 View의 투명도를 fromAlpha에서 toAlpha까지 변경합니다. 값은 0.0(완전 투명)에서 1.0(완전 표시)까지입니다. 기본적으로 애니메이션은 300ms 동안 지속됩니다. fillAfter=true 매개변수는 View를 최종 투명도 상태로 유지합니다.

xml
<!-- 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

TranslateAnimation은 View를 시작 위치(fromXDelta, fromYDelta)에서 끝 위치(toXDelta, toYDelta)로 이동합니다. 값은 픽셀, 부모의 백분율 또는 View 자체의 백분율로 지정됩니다. 예를 들어 100%는 View 너비의 100%를 의미합니다.

ScaleAnimation

ScaleAnimation은 pivotX/pivotY 지점을 기준으로 View의 크기를 조정합니다. fromXScale=1.0, toXScale=2.0은 너비를 두 배로 만듭니다. pivotType 매개변수는 피벗이 무엇을 기준으로 계산되는지 결정합니다: self, parent 또는 absolute. 크기 조정 애니메이션은 View의 실제 치수를 변경하지 않고 렌더링만 변경합니다.

RotateAnimation

RotateAnimation은 View를 피벗 지점을 중심으로 fromDegrees에서 toDegrees까지의 각도로 회전합니다. 각도는 도 단위로 측정됩니다: 0은 원래 위치, 360은 완전 회전입니다. 무한 회전의 경우 repeatCount=INFINITE를 사용하세요.

View Animation vs Property Animation

View Animation과 Property Animation(Animator)의 차이는 Android 애니메이션 아키텍처의 근본적인 차이입니다. View Animation은 렌더링에서만 작동하는 반면, Property Animation은 setter 메서드를 통해 실제 객체 속성을 변경하여 레이아웃 업데이트를 유발합니다.

기준View AnimationProperty Animation
API 수준API 1+(더 이상 사용되지 않음)API 11+(권장)
애니메이션 대상View 렌더링(canvas)객체 속성(setter)
애니메이션 후 클릭원래 위치새 위치
애니메이션 유형4 Tween + AnimationSetObjectAnimator, ValueAnimator, AnimatorSet
LayoutParams변경하지 않음setLayoutParams를 통해 변경
성능높음(canvas만)중간(setter에 따라 다름)

애니메이션의 XML 구성

View Animation은 일반적으로 res/anim/의 XML 파일에서 루트 요소 (AnimationSet) 또는 네 가지 유형 중 하나로 정의됩니다. AnimationSet을 사용하면 startOffset, duration, interpolator와 같은 공유 매개변수로 애니메이션을 결합할 수 있습니다.

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가 애니메이션의 최종 상태를 유지할지 여부를 결정합니다.

Kotlin 코드 예제

애니메이션은 일반적으로 XML에서 정의되지만 Kotlin을 사용하여 프로그래밍 방식으로도 만들 수 있습니다. 프로그래밍 방식 접근은 동적 매개변수에 유용합니다: 투명도 값은 정적으로 정의되지 않고 애플리케이션 상태에 따라 달라집니다.

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을 사용해야 하는 경우

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과 Property Animation의 차이점은 무엇인가요?

View Animation은 View의 렌더링만 변경합니다 — 애니메이션 후 View는 터치 이벤트에 대해 원래 위치에 유지됩니다. Property Animation은 객체의 실제 속성을 변경하여 LayoutParams를 업데이트하고 새 위치에서 클릭을 올바르게 처리합니다.

View Animation이 더 이상 사용되지 않는 이유는 무엇인가요?

Google은 Android 3.0(API 11)부터 View Animation을 더 이상 사용되지 않는 것으로 선언했습니다. 이유는 클릭 불일치(click mismatch)와 임의의 객체 속성을 애니메이션화할 수 없기 때문입니다. Property Animation은 이러한 문제를 해결하며 모든 새 프로젝트에 권장됩니다.

View Animation을 버튼 애니메이션에 사용할 수 있나요?

사용할 수 있지만 권장되지 않습니다. TranslateAnimation 후 버튼은 새 위치에 표시되지만 클릭은 원래 위치에 등록됩니다. 버튼의 경우 Property Animation 또는 Jetpack Compose에서 AnimatedVisibility가 있는 컴포저블을 사용하세요.

프로그래밍 방식으로 View Animation을 취소하는 방법은?

view.clearAnimation()을 호출하세요. fillAfter=true로 애니메이션이 시작된 경우 View는 최종 상태를 유지합니다. 원래 상태로 강제로 돌아가려면 clearAnimation()과 invalidate()를 호출하세요.

요약

  • View Animation — Android의 레거시 Tween 애니메이션 시스템: Alpha, Translate, Scale, Rotate의 4가지 유형
  • XML 마크업 res/anim/에서 , , , 요소와 루트 사용
  • AnimationSet은 공유 startOffset, duration, interpolator로 애니메이션을 결합
  • 클릭 불일치 — 애니메이션 후 View는 터치 이벤트에 대해 원래 위치에 유지
  • Property Animation — ObjectAnimator, AnimatorSet을 통한 최신 대체, 실제 속성으로 작동
  • fillAfter는 View를 최종 상태로 유지하지만 LayoutParams는 변경하지 않음
  • 마이그레이션 Property Animation으로의 전환은 클릭 불일치를 제거하고 성능을 15-20% 향상

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기