애니메이션 리소스는 다음 두 가지 유형의 애니메이션 중 하나를 정의할 수 있습니다.
- 속성 애니메이션
- 설정된 기간 동안 객체의 속성 값을
Animator
로 수정하여 애니메이션을 만듭니다. - 뷰 애니메이션
-
뷰 애니메이션 프레임워크로 만들 수 있는 애니메이션에는 두 가지 유형이 있습니다.
- 트윈 애니메이션:
Animation
을 사용해 단일 이미지에 일련의 변환을 진행하여 애니메이션을 만듭니다. - 프레임 애니메이션:
AnimationDrawable
을 사용해 연속된 이미지를 순서대로 표시하여 애니메이션을 만듭니다.
- 트윈 애니메이션:
속성 애니메이션
XML로 정의된 애니메이션으로, 설정된 시간 경과에 따른 타겟 객체의 속성(예: 배경 색상이나 알파 값)을 수정합니다.
- 파일 위치:
res/animator/filename.xml
파일 이름은 리소스 ID로 사용됩니다.- 컴파일된 리소스 데이터 유형:
ValueAnimator
,ObjectAnimator
또는AnimatorSet
의 리소스 포인터- 리소스 참조:
-
Java 기반 코드 또는 Kotlin 코드의 경우:
R.animator.filename
XML의 경우:@[package:]animator/filename
- 문법:
-
<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"]/> <animator 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> ... </set> </set>
파일에는 단일 루트 요소로
<set>
,<objectAnimator>
또는<valueAnimator>
가 있어야 합니다. 애니메이션 요소를<set>
요소 내에서 다른<set>
요소와 함께 그룹화할 수 있습니다. - 요소:
- 예:
-
res/animator/property_animator.xml
에 저장된 XML 파일:<set android:ordering="sequentially"> <set> <objectAnimator android:propertyName="x" android:duration="500" android:valueTo="400" android:valueType="intType"/> <objectAnimator android:propertyName="y" android:duration="500" android:valueTo="300" android:valueType="intType"/> </set> <objectAnimator android:propertyName="alpha" android:duration="500" android:valueTo="1f"/> </set>
이 애니메이션을 실행하려면 코드의 XML 리소스를
AnimatorSet
객체로 확장한 다음 애니메이션 집합을 시작하기 전에 모든 애니메이션의 타겟 객체를 설정해야 합니다.setTarget()
을 호출하면 편의상AnimatorSet
의 모든 하위 요소의 단일 타겟 객체가 설정됩니다. 다음 코드는 이 작업의 진행 방법을 보여줍니다.Kotlin
val set: AnimatorSet = AnimatorInflater.loadAnimator(myContext, R.animator.property_animator) .apply { setTarget(myObject) start() }
Java
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.animator.property_animator); set.setTarget(myObject); set.start();
- 참고 항목:
-
- 속성 애니메이션 개요
- 속성 애니메이션 시스템을 사용하는 방법에 관한 예는 API 데모를 참고하세요.
뷰 애니메이션
뷰 애니메이션 프레임워크는 XML에서 모두 선언할 수 있는 트윈 애니메이션과 프레임별 애니메이션을 둘 다 지원합니다. 다음 섹션에서는 이 두 애니메이션을 사용하는 방법을 설명합니다.
트윈 애니메이션
XML로 정의되는 애니메이션으로, 그래픽에서 회전, 페이딩, 이동, 확장과 같은 변환을 진행합니다.
- 파일 위치:
res/anim/filename.xml
파일 이름은 리소스 ID로 사용됩니다.- 컴파일된 리소스 데이터 유형:
Animation
의 리소스 포인터- 리소스 참조:
-
Java의 경우:
R.anim.filename
XML의 경우:@[package:]anim/filename
- 문법:
-
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... </set> </set>
파일에는 단일 루트 요소로
<alpha>
,<scale>
,<translate>
,<rotate>
또는 다른 애니메이션 요소(중첩된<set>
요소 포함)의 그룹을 갖는<set>
요소가 있어야 합니다. - 요소:
- 예:
-
res/anim/hyperspace_jump.xml
에 저장된 XML 파일:<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="700"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:duration="400" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:duration="400" /> </set> </set>
다음 애플리케이션 코드는 애니메이션을
ImageView
에 적용하고 애니메이션을 시작합니다.Kotlin
val image: ImageView = findViewById(R.id.image) val hyperspaceJump: Animation = AnimationUtils.
loadAnimation
(this, R.anim.hyperspace_jump) image.startAnimation
(hyperspaceJump)Java
ImageView image = (ImageView) findViewById(R.id.image); Animation hyperspaceJump = AnimationUtils.
loadAnimation
(this, R.anim.hyperspace_jump); image.startAnimation
(hyperspaceJump); - 참고 항목:
보간기
보간기는 XML로 정의된 애니메이션 수정자로, 애니메이션의 변경 속도에 영향을 줍니다. 보간기를 사용하면 기존 애니메이션 효과를 가속하거나 감속 또는 반복하고 앞뒤로 왔다갔다 하게 하는 등 다양하게 만들 수 있습니다.
보간기는 android:interpolator
속성이 있는 애니메이션 요소에 적용되고, 그 값은 보간기 리소스 참조입니다.
Android에서 사용할 수 있는 모든 보간기는 Interpolator
클래스의 서브클래스입니다. Android에는 보간기 클래스마다 참조할 수 있는 공개 리소스가 들어 있기 때문에 android:interpolator
속성을 사용하여 보간기를 애니메이션에 적용할 수 있습니다.
다음 표에는 각 보간기에 사용할 리소스가 명시되어 있습니다.
보간기 클래스 | 리소스 ID |
---|---|
AccelerateDecelerateInterpolator |
@android:anim/accelerate_decelerate_interpolator |
AccelerateInterpolator |
@android:anim/accelerate_interpolator |
AnticipateInterpolator |
@android:anim/anticipate_interpolator |
AnticipateOvershootInterpolator |
@android:anim/anticipate_overshoot_interpolator |
BounceInterpolator |
@android:anim/bounce_interpolator |
CycleInterpolator |
@android:anim/cycle_interpolator |
DecelerateInterpolator |
@android:anim/decelerate_interpolator |
LinearInterpolator |
@android:anim/linear_interpolator |
OvershootInterpolator |
@android:anim/overshoot_interpolator |
다음은 이러한 리소스 중 android:interpolator
속성을 갖는 리소스를 적용하는 방법입니다.
<set android:interpolator="@android:anim/accelerate_interpolator"> ... </set>
맞춤 보간기
플랫폼에서 제공되는 보간기가 만족스럽지 않다면 속성을 수정하여 맞춤 보간기 리소스를 만들 수 있습니다.
예를 들어 AnticipateInterpolator
의 가속 속도를 조정하거나 CycleInterpolator
의 주기 수를 조정할 수 있습니다. 이를 진행하려면 XML 파일에서 고유한 보간기 리소스를 만들어야 합니다.
- 파일 위치:
res/anim/filename.xml
파일 이름은 리소스 ID로 사용됩니다.- 컴파일된 리소스 데이터 유형:
- 상응하는 보간기 객체의 리소스 포인터
- 리소스 참조:
- XML의 경우:
@[package:]anim/filename
- 문법:
-
<?xml version="1.0" encoding="utf-8"?> <InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android" android:attribute_name="value" />
어떠한 속성도 적용하지 않으면 보간기는 플랫폼에서 제공된 보간기(위 표에 나열된 보간기)와 정확히 동일하게 작동합니다.
- 요소:
- XML로 정의될 경우 각
Interpolator
구현은 이름 첫 글자를 소문자로 합니다. - 예:
-
res/anim/my_overshoot_interpolator.xml
에 저장된 XML 파일:<?xml version="1.0" encoding="utf-8"?> <overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:tension="7.0" />
다음 애니메이션 XML은 보간기를 적용합니다.
<scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/my_overshoot_interpolator" android:fromXScale="1.0" android:toXScale="3.0" android:fromYScale="1.0" android:toYScale="3.0" android:pivotX="50%" android:pivotY="50%" android:duration="700" />
프레임 애니메이션
XML로 정의된 애니메이션으로, 영화처럼 일련의 이미지를 순서대로 표시합니다.
- 파일 위치:
res/drawable/filename.xml
파일 이름은 리소스 ID로 사용됩니다.- 컴파일된 리소스 데이터 유형:
AnimationDrawable
의 리소스 포인터- 리소스 참조:
-
Java의 경우:
R.drawable.filename
XML의 경우:@[package:]drawable.filename
- 문법:
-
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot=["true" | "false"] > <item android:drawable="@[package:]drawable/drawable_resource_name" android:duration="integer" /> </animation-list>
- 요소:
- 예:
-
res/drawable/rocket_thrust.xml
에 저장된 XML 파일:<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /> </animation-list>
다음 애플리케이션 코드는 애니메이션을
View
의 배경으로 설정한 다음 애니메이션을 재생합니다.Kotlin
val rocketImage: ImageView = findViewById(R.id.rocket_image) rocketImage.
setBackgroundResource
(R.drawable.rocket_thrust) val rocketAnimation = rocketImage.background
if (rocketAnimation isAnimatable
) { rocketAnimation.start()
}Java
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.
setBackgroundResource
(R.drawable.rocket_thrust); rocketAnimation = rocketImage.getBackground()
; if (rocketAnimation instanceofAnimatable
) { ((Animatable)rocketAnimation).start()
; } - 참고 항목: