안드로이드에서 애니메이션을 적용하는 방법

seong-hwan Kim
shDev
Published in
8 min readFeb 9, 2022

안드로이드에서는 Animation 클래스와 Animator 클래스로 뷰에 애니메이션을 적용할 수 있으며 Animator의 경우 사용하는 방법이 다양하기 때문에 언제 어떤 Animator를 사용해야 하는지 혼란이 올 수 있다.

이 글에서는 안드로이드에서 Animation 클래스와 Animator 클래스의 차이점과 여러 Animator의 특징과 사용 방법에 대해 간단히 소개한다.

개요

안드로이드 3.0 이후의 기기에서는 뷰의 애니메이션을 적용할 때 android.animation 패키지의 API(Animator 클래스)가 권장된다. 안드로이드 3.0 이전의 Animation 기반의 애니메이션 api가 단순히 뷰가 화면에 보여지는 방식만 변경하는것과 대조적으로 Animator 기반의 애니메이션 api는 실제로 뷰의 프로퍼티를 변경한다.

뷰의 속성을 변경하지 않고 보여지는 방식만 변경하고 싶다면 Animation 기반의 애니메이션을 사용할 수 있다.

안드로이드는 애니메이션을 위해 세 가지 매커니즘을 제공한다.

  • view animation: 뷰에 대해 간단한 변환(위치, 사이즈, 회전, …)을 적용하는 애니메이션. android.view.animation 패키지에서 관련된 클래스를 제공한다. tween animation 이라고도 한다. xml 리소스의 경우 res/anim 디렉토리를 사용한다.
  • property animation: Animator 객체가 갖는 시간 간격 동안 대상 객체의 프로퍼티 값을 변경하는 애니메이션. xml 리소스의 경우 res/animator 디렉토리를 사용한다.
  • frame-by-frame animation: 여러 개의 Drawable 리소스를 연속적으로 배치하여 구성하는 애니메이션. AnimationDrawable을 사용한다.

Animation(view animation)

tweened animation을 다루는 애니메이션.

뷰의 시각적 표시만 변경하는 방식으로 구현되었기 때문에 단순히 뷰의 투명도를 변경하는 경우에는 큰 문제가 없지만 뷰의 이동, 회전, 크기를 변경하는 경우 문제가 발생한다. 예를 들어 Animation을 사용하여 뷰를 이동하더라도 실제 뷰의 위치가 변경되지는 않기 때문에 이동한 뷰를 터치하더라도 정상적으로 동작하지 않는다. 따라서 가능하다면 Animator를 사용하는것이 권장된다.

리소스 형식

리소스 내에서 사용 가능한 태그 목록은 다음과 같다.

  • <set>: 다른 애니메이션 요소(alpha, scale, translate, rotate) 또는 하위 set을 요소로 가지는 컨테이너. AnimationSet 객체를 나타낸다. shareInterpolator 속성을 true로 하여 모든 하위 요소에서 동일한 interpolator를 사용하도록 설정할 수 있다.
  • <alpha>: 투명도 조절 애니메이션으로 AlphaAnimaiton을 나타낸다. fromAlpha, toAlpha 속성에는 0.0 ~ 1.0 사이의 float 값이 적용된다.
  • <scale>: 크기 조절 애니메이션으로 ScaleAnimation을 나타낸다. pivotXpivotY를 지정하여 크기가 변경되는 기준점을 지정할 수 있다. 예를 들어 pivotX, pivotY를 0%, 0%(왼쪽 상단)로 지정하는 경우 크기는 우측 하단으로 커진다.
  • <translate>: 수직, 수평 방향 이동 애니메이션으로 TranslationAnimation을 나타낸다. 이동할 픽셀 수, 자신을 기준으로 하는 백분율(-100% ~ 100%), 부모를 기준으로 하는 백분율(-100%p ~ 100%p) 등 세 가지 형태의 값을 적용할 수 있다.
  • <rotate>: 회전 애니메이션으로 RotateAnimation을 나타낸다. pivotX, pivotY 속성을 통해 회전을 적용할 중심점을 설정할 수 있다.

각각의 태그에서는 공통적으로 Animation 클래스가 제공하는 속성을 설정할 수도 있다.

  • duration: 전체 애니메이션이 실행되는 밀리초 단위의 지속 시간
  • fillAfter: 애니메이션 변환을 애니메이션보다 나중에 적용한다.
  • fillBefore: 애니메이션 변환을 애니메이션보다 먼저 적용한다.
  • interpolator: 시간에 따른 애니메이션 효과의 속도 변화를 설정한다. 인터폴레이터를 지정할 때는 android:anim/interpolatorName에 있는 시스템 애니메이션 리소스를 참조한다.
  • repeatCount: 애니메이션 반복 횟수
  • repeatMode: 애니메이션 반복 시 동작 방식을 설정한다. restart와 reverse를 적용할 수 있다.
  • startOffset: 애니메이션이 시작하기까지 대기하는 밀리초 단위의 지연 시간

Animator(property animation)

기존 Animation 방식의 단점을 개선하여 안드로이드 3.0 이후 등장한 방식. 거의 모든 값과 프로퍼티에 애니메이션 경로를 만들 수 있는 강력한 프레임워크.

프로퍼티 애니메이터을 사용하면 애니메이션이 적용되는 대상 객체에 대부분의 숫자형 프로퍼티 애니메이션을 적용할 수 있다. 이때 특정 프로퍼티에 연결된 애니메이터를 정의할 수도 있으며, 값을 기준으로 애니메이션을 정의할 수도 있다.

Animator 클래스는 여러 가지 방법으로 사용할 수 있다.

  • ViewPropertyAnimator
  • ObjectAnimator
  • PropertyValuesHolder
  • AnimatorSet
  • ValueAnimator
https://www.crocus.co.kr/1690

ViewPropertyAnimator

뷰 프로퍼티에 애니메이션을 적용하는 가장 간단한 방법.

ViewPropertyAnimator 클래스 자체는 Animator를 상속하는 클래스가 아니며 내부적으로 ValueAnimator를 사용하여 애니메이션을 구현한다.

하나의 뷰에 대해 애니메이션을 적용하고, Animator 객체를 여러 개 생성하지 않으면서 동시에 실행할 필요가 있을 때 사용할 수 있다. 하지만 ViewPropertyAnimator 만으로는 반복적인 애니메이션을 만들 수 없으며, 여러 뷰에 대해 공통으로 애니메이션이 적용될 때 애니메이션 자체를 재사용할 수 없다는 단점이 있다.

ObjectAnimator

ValueAnimator의 서브클래스로 타겟 객체의 프로퍼티에 대한 애니메이션을 지원한다. 하지만 애니메이션의 순서를 적용하거나, 여러 프로퍼티를 함께 변경하는 등의 사용은 불가능하다.

이 클래스의 생성자에는 애니메이션을 적용할 객체와 프로퍼티의 이름을 명시적으로 전달해야 하며, 애니메이션이 적용되는 클래스는 해당 프로퍼티의 게터와 세터를 제공할 수 있어야 한다.

PropertyValuesHolder

객체의 여러 프로퍼티를 함께 변경시킬 때 사용할 수 있다.

AnimatorSet

동시에 여러 뷰에 대해 애니메이션을 적용하거나, 여러 애니메이션을 특정 순서로 동작시켜야 할 때 사용한다.

ValueAnimator

뷰의 특정 속성에 애니메이션을 적용하지 않고 값의 변화에 따라 애니메이션을 적용할 때 사용한다. ValueAnimator의 동작만으로는 뷰가 변경되지 않기 때문에 onAnimationUpdate 리스너 내에서 뷰의 속성을 변경해야 한다.

리소스 형식

애니메이터 리소스는 ValueAnumator, ObjectAnimator, AnimatorSet을 나타낸다.

애니메이터 리소스의 루트는 <set>, <objectAnimator>, <animator> 중 하나를 선택해야 하며 <set> 태그는 리소스 내에서 중첩 가능하다.

<propertyValuesHolder> 태그는 API 23 이후 리소스 내에서 사용하는것이 가능하다.

참고

https://developer.android.com/guide/topics/graphics/prop-animation?hl=ko

https://developer.android.com/guide/topics/resources/animation-resource?hl=ko

--

--