안드로이드에서 제공하는 애니메이션 구현 방법 중 하나 입니다.
전 포스트에서 다뤘던 View Animation(Tween)보다 나중에 나온 애니메이션 API 입니다.
Tween에서는 anim 디렉토리에 정의하고 사용했지만, ObjectAnimator는 animator 디렉토리에 정의합니다.
이번에는 ObjectAnimator에서 사용되는 속성들을 살펴보고, 구현 방법을 알아보도록 하겠습니다.
ObjectAnimator에서 사용되는 속성은 다음과 같습니다.
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["restart" | "reverse"]
android:valueType=["intType" | "floatType"]/>
</set>
각각의 속성들을 하나씩 살펴보면 다음과 같습니다.
alpha
, rotationX
, translationX
, backgroundColor
, textColor
등이 있습니다. xml 내에서는 객체 지정이 불가능 하므로, 코드 내에서 ObjectAnimator.setTarge()
으로 해당 속성을 가진 객체를 지정해줘야 합니다.colorType
을 사용합니다.Set에 여러개의 ObjectAnimator를 정의할 수도 있지만, propertyValuesHolder
를 사용해서 구현할 수 있습니다.
<objectAnimator
android:duration="5000"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:startOffset="5000">
<propertyValuesHolder
android:propertyName="rotationY"
android:valueFrom="0"
android:valueTo="3600"
android:valueType="floatType" />
<propertyValuesHolder
android:propertyName="backgroundColor"
android:valueFrom="@color/white"
android:valueTo="@color/black"
android:valueType="colorType" />
</objectAnimator>
propertyValuesHolder를 사용하면, 하나의 ObjectAnimator 루트에서 여러가지 속성들에 대한 애니메이션을 정의할 수 있습니다.
위 예시 코드는 10바퀴 회전하면서 컬러가 하얀색에서 검정색으로 바뀌는 애니메이션 입니다.
이번에는 애니메이션을 적용시켜보겠습니다.
val intervalXAnimationColorChange = AnimatorInflater.loadAnimator( this, R.animator.object_ani_interval_color_change ).apply {
duration = 1000
interpolator = AccelerateDecelerateInterpolator()
addListener( object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {
Toast.makeText( this@ObjectAnimatorActivity, "애니메이션 시작", Toast.LENGTH_SHORT ).show()
}
override fun onAnimationEnd(animation: Animator?) {
Toast.makeText( this@ObjectAnimatorActivity, "애니메이션 종료", Toast.LENGTH_SHORT ).show()
}
override fun onAnimationCancel(animation: Animator?) {
Toast.makeText( this@ObjectAnimatorActivity, "애니메이션 취소", Toast.LENGTH_SHORT ).show()
}
override fun onAnimationRepeat(animation: Animator?) {
Toast.makeText( this@ObjectAnimatorActivity, "애니메이션 시작", Toast.LENGTH_SHORT ).show()
}
})
}
ViewAnimation의 tween과는 달리, AnimationUtils
를 사용하지 않고 AnimatorInflater
를 사용합니다.
duration
과 interpolator
는 xml에서도 지정할 수 있고 코드에서 지정할 수도 있습니다.
또, ViewAnimation과 마찬가지로 애니메이션에 대한 리스너를 달아줄 수 있습니다.
만약 위처럼 모든 상황에서의 리스너가 필요 없다면 doOn~
를 통해 원하는 상황에서의 리스너를 각각 정의할 수 있습니다.
intervalXAnimationColorChange.setTarget( view )
애니메이션을 적용시킬 객체를 지정합니다.
여기서 중요한 것은 xml에서 지정한 propertyName 속성을 가지고 있는 객체를 지정해야 합니다.
예를 들어, propertyName를 textColor로 지정하고 객체는 ImageView로 지정했다면 애니메이션을 동작하지 않습니다.
intervalXAnimationColorChange.start()
intervalXAnimationColorChange.cancel()
start()와 cancel()을 이용해 애니메이션을 실행, 취소할 수 있습니다.
xml을 작성하지 않고, 코드로 ObjectAnimator를 생성하는 방법은 다음과 같습니다.
ObjectAnimator.ofFloat(view, View.TRANSLATION_X, -300f, 300f).apply {
duration = 500
repeatMode = ValueAnimator.REVERSE
repeatCount = ValueAnimator.INFINITE
}.start()
ObjectAnimator
의 ofFloat
이나 ofInt
등의 메소드를 통해 ObjectAnimator 객체를 생성할 수 있습니다.
가장 큰 차이점은 애니메이션 지정 객체의 클릭 이벤트 입니다.
ViewAnimation은 애니메이션을 통해 뷰의 위치가 바뀌어도 클릭 이벤트는 원래 뷰가 차지하던 위치에서만 받을 수 있었습니다.
하지만 ObjectAnimator는 애니메이션을 통해 바뀐 위치에서 클릭 이벤트를 받을 수 있다는 점이 있습니다.
이미 이것만으로도 ViewAnimation의 사용을 지양하고 ObjectAnimator를 사용해야 할 것 같습니다.
그 외에도 ObjectAnimator는 doOn~
을 통해서 원하는 상황에서의 리스너만 각각 지정할 수 있다는 점이 있습니다.