動畫資源可定義以下兩種動畫類型的其中之一:
- 屬性動畫
- 使用
Animator
修改特定時間範圍內的物件屬性值,藉此建立動畫。 - 視圖動畫
-
您可以使用視圖動畫架構建立兩種動畫類型:
- 補間動畫:使用
Animation
對單張圖片進行一系列轉換來建立動畫 - 影格動畫:使用
AnimationDrawable
依序顯示一系列圖片序列來建立動畫。
- 補間動畫:使用
屬性動畫
在 XML 中定義的動畫,可在特定的時間範圍內修改目標物件的屬性,例如背景顏色或 Alpha 值。
- 檔案位置:
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>
元素中。 - 元素:
- 例如:
-
XML 檔案儲存在
res/animator/property_animator.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
所有子項的目標物件。以下程式碼說明如何執行這項操作: - 另請參閱:
視圖動畫
視圖動畫架構支援補間動畫和逐格動畫,兩者皆是在 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>
元素。 - 元素:
- 例如:
-
XML 檔案儲存在
res/anim/hyperspace_jump.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
實作的名稱都會以小寫英文字母開頭。 - 例如:
-
XML 檔案儲存在
res/anim/my_overshoot_interpolator.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> - 元素:
- 例如:
-
XML 檔案儲存在
res/drawable/rocket_thrust.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()
;
} - 另請參閱: