動畫資源

動畫資源可定義兩種動畫類型的其中一種:

屬性動畫
使用 Animator 修改特定時間範圍內的物件屬性值以建立動畫。
檢視動畫

您可以使用檢視動畫架構的動畫類型有兩種:

屬性動畫

在 XML 中定義的動畫,可在特定的時間範圍內修改目標物件的屬性,例如背景顏色或 Alpha 值。

檔案位置:
res/animator/filename.xml
檔案名稱會做資源 ID 使用。
編譯資源資料類型:
ValueAnimatorObjectAnimatorAnimatorSet 的資源指標。
資源參照:
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> 元素。

元素:
<set>
包含其他動畫元素 (<objectAnimator><valueAnimator> 或其他 <set> 元素) 的容器。代表 AnimatorSet

您可以指定巢狀 <set> 標記以進一步分組動畫。每個 <set> 都可以定義各自的 ordering 屬性。

屬性:

android:ordering
「關鍵字」。指定此集合中的動畫播放順序。
說明
sequentially依序播放此組合中的動畫
together (預設)同時播放此組合中的動畫。
<objectAnimator>
在特定時間內為物件的特定屬性建立動畫效果。代表 ObjectAnimator

屬性:

android:propertyName
「字串」。必要。要建立動畫的物件屬性,以其名稱參照。舉例來說,您可以為檢視畫面物件指定 "alpha""backgroundColor"。但是 objectAnimator 元素不會公開 target 屬性,因此您無法在 XML 宣告中設定要使用動畫效果的物件。您必須呼叫 loadAnimator(),並呼叫 setTarget() 以設定包含此屬性的目標物件,才能加載動畫 XML 資源。
android:valueTo
「浮點值、int 或顏色」。必要。動畫屬性結束處的值。顏色會以六位數的十六進位數字表示 (例如 #333333)。
android:valueFrom
「浮點值、int 或顏色」。動畫屬性開始處的值。如未指定,動畫會以屬性 get 方法取得的值開始。顏色會以六位數的十六進位數字表示 (例如 #333333)。
android:duration
「int」。動畫的時間 (以毫秒為單位)。預設值為 300 毫秒。
android:startOffset
「int」。呼叫 start() 後,動畫延遲的毫秒數。
android:repeatCount
「int」。重複播放動畫的次數。設為 "-1" 即可無限重複或正整數。舉例來說,"1" 值表示動畫會在動畫初次執行後重複播放一次,因此動畫總共會播放兩次。預設值為 "0",表示不會重複。
android:repeatMode
「int」。動畫結束時的動畫行為。android:repeatCount 必須設為正整數或 "-1",這項屬性才會生效。將 "reverse" 設為包含每次疊代的動畫反向方向,或設為 "restart",讓動畫從每次開始時循環。
android:valueType
「關鍵字」。如果值是顏色,請勿指定此屬性。動畫架構會自動處理顏色值
說明
intType指定動畫值為整數
floatType (預設)指定動畫值為浮點值
<animator>
在指定時間範圍內執行動畫。代表 ValueAnimator

屬性:

android:valueTo
「浮點值、int 或顏色」。必要。動畫結束處的值。顏色會以六位數的十六進位數字表示 (例如 #333333)。
android:valueFrom
「浮點值、int 或顏色」。必要。動畫開始處的值。顏色會以六位數的十六進位數字表示 (例如 #333333)。
android:duration
「int」。動畫的時間 (以毫秒為單位)。預設為 300 毫秒。
android:startOffset
「int」。呼叫 start() 後,動畫延遲的毫秒數。
android:repeatCount
「int」。重複播放動畫的次數。設為 "-1" 即可無限重複或正整數。舉例來說,"1" 值表示動畫會在動畫初次執行後重複播放一次,因此動畫總共會播放兩次。預設值為 "0",表示不會重複。
android:repeatMode
「int」。動畫結束時的動畫行為。android:repeatCount 必須設為正整數或 "-1",這項屬性才會生效。將 "reverse" 設為包含每次疊代的動畫反向方向,或設為 "restart",讓動畫從每次開始時循環。
android:valueType
「關鍵字」。如果值是顏色,請勿指定此屬性。動畫架構會自動處理顏色值。
說明
intType指定動畫值為整數
floatType (預設)指定動畫值為浮點值
例如:
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 的所有子項目標目標物件。以下程式碼說明如何執行這項作業:

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();
另請參閱:

檢視動畫

檢視動畫架構支援補間動畫和畫面動畫,且兩種都可在 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> 元素。

元素:
<set>
包含其他動畫元素 (<alpha><scale><translate><rotate>) 或其他 <set> 元素的容器。代表 AnimationSet

屬性:

android:interpolator
「內插器資源」。要套用至動畫的 Interpolator。此值必須是可指定內插器資源 (而非內插器類別名稱) 的資源參照。平台提供預設的內插器資源,您也可以自行建立內插資源。如要進一步瞭解內插器,請參閱下方的討論內容。
android:shareInterpolator
「布林值」。如要在所有子項元素之間共用相同的內插器,則為「true」。
<alpha>
淡入或淡出動畫。代表 AlphaAnimation

屬性:

android:fromAlpha
「浮點值」。開始不透明度偏移,0.0 為透明,1.0 為不透明。
android:toAlpha
「浮點值」。結束不透明度偏移,0.0 為透明,1.0 為不透明。

如要進一步瞭解 <alpha> 支援的屬性,請參閱 Animation 類別參照 (其中所有 XML 屬性都會由此元素沿用)。

<scale>
調整大小的動畫。指定 pivotXpivotY,可指定圖片朝外 (或朝內) 縮放的聚焦點。舉例來說,如果這些值是 0、0 (左上角),所有變化都會朝向並往右。代表 ScaleAnimation

屬性:

android:fromXScale
「浮點值」。開始 X 大小偏移,1.0 為不變。
android:toXScale
「浮點值」。結束 X,大小偏移,1.0 為不變。
android:fromYScale
「浮點值」。開始 Y 大小偏移,1.0 為不變。
android:toYScale
「浮點值」。結束 Y 大小偏移,1.0 為不變。
android:pivotX
「浮點值」。縮放物件時,X 座標會保持固定。
android:pivotY
「浮點值」。縮放物件時,Y 座標會保持固定。

如要進一步瞭解 <scale> 支援的屬性,請參閱 Animation 類別參照 (其中所有 XML 屬性都會由此元素沿用)。

<translate>
縱向和/或橫向動作。支援以下三種格式中任一種的屬性:開頭為從 -100 到 100 的值,以「%」結束,表示相對的百分比;開頭從 -100 到 100 的值,以「%p」結束,表示其父項相對的百分比;沒有字尾的浮點值,表示絕對值。代表 TranslateAnimation

屬性:

android:fromXDelta
「浮點值或百分比」。開始 X 軸偏移。表示:相對於正常位置的像素 (例如 "5")、相對於元素寬度的百分比 (例如 "5%"),或相對於父項寬度的百分比 (例如 "5%p")。
android:toXDelta
「浮點值或百分比」。結束 X 偏移。表示:相對於正常位置的像素 (例如 "5")、相對於元素寬度的百分比 (例如 "5%"),或相對於父項寬度的百分比 (例如 "5%p")。
android:fromYDelta
「浮點值或百分比」。開始 Y 軸偏移。表示:相對於正常位置的像素 (例如 "5")、相對於元素高度的百分比 (例如 "5%"),或相對於父項高度的百分比 (例如 "5%p")。
android:toYDelta
「浮點值或百分比」。結束 Y 軸偏移。表示:相對於正常位置的像素 (例如 "5")、相對於元素高度的百分比 (例如 "5%"),或相對於父項高度的百分比 (例如 "5%p")。

如要進一步瞭解 <translate> 支援的屬性,請參閱 Animation 類別參照 (其中所有 XML 屬性都會由此元素沿用)。

<rotate>
旋轉動畫。代表 RotateAnimation

屬性:

android:fromDegrees
「浮點值」。開始角度位置,以度為單位。
android:toDegrees
「浮點值」。結束角度位置,以度為單位。
android:pivotX
「浮點值或百分比」。旋轉中心的 X 座標。表示:相對於物件左側邊緣的像素 (例如 "5")、相對於物件左側邊緣的百分比 (例如 "5%"),或相對於父項容器左側邊緣的百分比 (例如 "5%p")。
android:pivotY
「浮點值或百分比」。旋轉中心的 Y 座標。表示:相對於物件頂部邊緣的像素 (例如 "5")、相對於物件頂部邊緣的百分比 (例如 "5%"),或相對於父項容器頂部邊緣的百分比 (例如 "5%p")。

如要進一步瞭解 <rotate> 支援的屬性,請參閱 Animation 類別參照 (其中所有 XML 屬性都會由此元素沿用)。

例如:
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 並開始動畫:

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 實作的名稱都會以小寫開頭。

<accelerateDecelerateInterpolator>
變更速率開始和結束的速度緩慢,過程中會加速。

沒有任何屬性。

<accelerateInterpolator>
變更速率緩慢,然後逐漸加速。

屬性:

android:factor
「浮點值」。加速速率 (預設為 1)。
<anticipateInterpolator>
變更先從反向開始,然後向前快速滑過。

屬性:

android:tension
「浮點值」。要套用的張力量 (預設值為 2)。
<anticipateOvershootInterpolator>
此變更會先從反向開始,然後向前快速滑過並超過目標值,再於最終值停止。

屬性:

android:tension
「浮點值」。要套用的張力量 (預設值為 2)。
android:extraTension
「浮點值」。要乘以張力的量 (預設值為 1.5)。
<bounceInterpolator>
變更在結束時跳出。

沒有任何屬性

<cycleInterpolator>
以指定的週期數重複播放動畫。變更的速率符合正弦模式。

屬性:

android:cycles
「整數」。週期數 (預設為 1)。
<decelerateInterpolator>
變動率迅速開始,再減速。

屬性:

android:factor
「浮點值」。減速速率 (預設為 1)。
<linearInterpolator>
變化速率是固定的。

沒有任何屬性。

<overshootInterpolator>
變更向前快速滑過,然後超過最後的值再返回。

屬性:

android:tension
「浮點值」。要套用的張力量 (預設值為 2)。
例如:

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>
元素:
<animation-list>
必要。這必須是根元素。包含一或多個 <item> 元素。

屬性:

android:oneshot
「布林值」。如果要執行動畫一次,則為「true」;「false」則表示循環播放。
<item>
動畫的單個畫面。必須是 <animation-list> 元素的子項。

屬性:

android:drawable
「可繪製資源」。此畫面要使用的可繪項目。
android:duration
「整數」。顯示此畫面的時間長度,以毫秒為單位。
例如:
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>
此應用程式程式碼會將動畫設為檢視畫面的背景,然後播放動畫:

Kotlin

val rocketImage: ImageView = findViewById(R.id.rocket_image)
rocketImage.setBackgroundResource(R.drawable.rocket_thrust)

val rocketAnimation = rocketImage.background
if (rocketAnimation is Animatable) {
    rocketAnimation.start()
}

Java

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = rocketImage.getBackground();
if (rocketAnimation instanceof Animatable) {
    ((Animatable)rocketAnimation).start();
}
另請參閱: