애니메이션 리소스는 다음 두 가지 유형의 애니메이션 중 하나를 정의할 수 있습니다.
- 속성 애니메이션
- 설정된 기간 동안 객체의 속성 값을
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
의 모든 하위 요소의 단일 타겟 객체가 설정됩니다. 다음 코드는 이 작업의 진행 방법을 보여줍니다. - 참고 항목:
-
- 속성 애니메이션 개요
- 속성 애니메이션 시스템을 사용하는 방법에 관한 예는 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
에 적용하고 애니메이션을 시작합니다.val image: ImageView = findViewById(R.id.image)
val hyperspaceJump: Animation = AnimationUtils.loadAnimation
(this, R.anim.hyperspace_jump)
image.startAnimation
(hyperspaceJump)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
의 배경으로 설정한 다음 애니메이션을 재생합니다.val rocketImage: ImageView = findViewById(R.id.rocket_image)
rocketImage.setBackgroundResource
(R.drawable.rocket_thrust)
val rocketAnimation = rocketImage.background
if (rocketAnimation isAnimatable
) {
rocketAnimation.start()
}ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource
(R.drawable.rocket_thrust);
rocketAnimation = rocketImage.getBackground()
;
if (rocketAnimation instanceofAnimatable
) {
((Animatable)rocketAnimation).start()
;
} - 참고 항목: