Android復習(二)應用資源 --> 動畫
沒什么好總結的 復制自 https://developer.android.google.cn/guide/topics/resources/animation-resource 有需要的可以查看官方文檔
動畫資源
一個動畫資源可以定義以下兩種動畫類型之一:
- 屬性動畫
- 通過使用
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=["repeat" | "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=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <set> ... </set> </set>
該文件必須具有一個根元素,可以是
<set>、<objectAnimator>或<valueAnimator>。您可以將動畫元素(包括其他<set>元素)組合到<set>元素中。 - 元素:
<objectAnimator>- 在特定的一段時間內為對象的特定屬性創建動畫。代表
ObjectAnimator。屬性:
android:propertyName- 字符串。必需。要添加動畫的對象屬性,通過其名稱引用。例如,您可以為 View 對象指定
"alpha"或"backgroundColor"。 但是,objectAnimator元素不包含target屬性,因此您無法在 XML 聲明中設置要添加動畫的對象。您必須通過調用loadAnimator()來擴充您的動畫 XML 資源,然后調用setTarget()來設置包含此屬性的目標對象。 android:valueTo- 浮點數、整數或顏色。必需。動畫屬性的結束值。顏色以六位十六進制數字表示(例如,#333333)。
android:valueFrom- 浮點數、整數或顏色。動畫屬性的開始值。如果未指定,則動畫將從屬性的 get 方法獲得的值開始。顏色以六位十六進制數字表示(例如,#333333)。
android:duration- 整數。動畫的時間,以毫秒為單位。默認為 300 毫秒。
android:startOffset- 整數。調用
start()后動畫延遲的毫秒數。 android:repeatCount- 整數。動畫的重復次數。設為
"-1"表示無限次重復,也可設為正整數。例如,值"1"表示動畫在初次播放后重復播放一次,因此動畫總共播放兩次。默認值為"0",表示不重復。 android:repeatMode- 整數。動畫播放到結尾處的行為。
android:repeatCount必須設置為正整數或"-1",該屬性才有效。設置為"reverse"可讓動畫在每次迭代時反向播放,設置為"repeat"則可讓動畫每次從頭開始循環播放。 android:valueType- 關鍵字。如果值為顏色,則不要指定此屬性。動畫框架會自動處理顏色值
值 說明 intType指定動畫值為整數 floatType(默認)指定動畫值為浮點數
<animator>在指定的時間段內執行動畫。代表 ValueAnimator。
屬性:
android:valueTo浮點數、整數或顏色。必需。動畫的結束值。顏色以六位十六進制數字表示(例如,#333333)。android:valueFrom浮點數、整數或顏色。必需。動畫的開始值。顏色以六位十六進制數字表示(例如,#333333)。android:duration整數。動畫的時間,以毫秒為單位。默認為 300ms。android:startOffset整數。調用 start() 后動畫延遲的毫秒數。。android:repeatCount整數。動畫的重復次數。設為 "-1" 表示無限次重復,也可設為正整數。例如,值 "1" 表示動畫在初次播放后重復播放一次,因此動畫總共播放兩次。默認值為 "0",表示不重復。android:repeatMode整數。動畫播放到結尾處的行為。android:repeatCount 必須設置為正整數或 "-1",該屬性才有效。設置為 "reverse" 可讓動畫在每次迭代時反向播放,設置為 "repeat" 則可讓動畫每次從頭開始循環播放。android:valueType關鍵字。如果值為顏色,則不要指定此屬性。動畫框架會自動處理顏色值。
| 值 | 說明 |
|---|---|
intType |
指定動畫值為整數 |
floatType(默認) |
指定動畫值為浮點數 |
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 的所有子項的目標對象。以下代碼展示了如何執行此操作:
java代碼:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.animator.property_animator);
set.setTarget(myObject);
set.start();
kotlin代碼:
val set: AnimatorSet = AnimatorInflater.loadAnimator(myContext, R.animator.property_animator)
.apply {
setTarget(myObject)
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>元素。 - 元素:
- 示例:
- 保存在
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并啟動動畫:java 代碼: ImageView image = (ImageView) findViewById(R.id.image); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); image.startAnimation(hyperspaceJump); kotlin 代碼: val image: ImageView = findViewById(R.id.image) val hyperspaceJump: Animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump) image.startAnimation(hyperspaceJump) - 另請參閱:
插值器
插值器是在 XML 中定義的動畫修改器,它會影響動畫的變化率。插值器可對現有的動畫效果執行加速、減速、重復、退回等。
插值器通過 android:interpolator 屬性應用于動畫元素,該屬性的值是對插值器資源的引用。
Android 中提供的所有插值器都是 Interpolator 類的子類。為便于您使用 android:interpolator 屬性將插值器應用于動畫,Android 針對每個插值器類包含了一個可供您引用的公共資源。下表指定了每個插值器要使用的資源:
| 插值器類 | 資源 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實現的名稱都以小寫字母開頭。屬性:
android:cycles- 整數。循環次數(默認值為 1)。
<decelerateInterpolator>- 變化率開始時很快,然后減慢。
屬性:
android:factor- 浮點數。減速率(默認值為 1)。
<linearInterpolator>- 變化率恒定不變。
沒有屬性。
<overshootInterpolator>- 先急速正向變化,再超過最終值,然后回到最終值。
屬性:
android:tension- 浮點數。要應用的張力(默認為 2)。
保存在 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.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 的背景,然后播放動畫:
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(); } 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() }- 保存在

浙公網安備 33010602011771號