以拋射為基礎的動畫會使用與物件速度成正比的摩擦力。也可以用來為物件的屬性建立動畫效果,並逐漸結束動畫。具有初始動量,大部分是從手勢速度接收到的,然後逐漸減慢。當動畫速度太低,導致裝置螢幕上無明顯變化時,動畫就會結束。
如要瞭解相關主題,請參閱下列指南:
新增 AndroidX 程式庫
如要使用物理動畫,您必須在專案中新增 AndroidX 程式庫,如下所示:
- 開啟應用程式模組的
build.gradle
檔案。 - 將 AndroidX 程式庫新增至
dependencies
區段。Groovy
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
建立快速滑過動畫
FlingAnimation
類別可讓您為物件建立快速滑過動畫。如要建立快速滑過動畫,請建立 FlingAnimation
類別的例項,並提供要建立動畫的物件和物件屬性。
Kotlin
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
設定速率
起始速率定義了動畫屬性在動畫開始時變更的速度。預設起始速率設為每秒零像素。因此,您必須定義起始速率,確保動畫不會立即結束。
您可以使用固定值做為起始速度,也可以根據觸控手勢的速率進行設定。如果您選擇提供固定值,應定義每秒以 dp 為單位的值,然後將其轉換為每秒像素。以每秒 dp 來定義值,可讓速率不受裝置的密度和板型規格影響。如要進一步瞭解如何將起始速度轉換為每秒像素,請參閱 Spring Animation 中的「將每秒 dp 轉換為每秒像素」一節。
如要設定速率,請呼叫 setStartVelocity()
方法,並傳送每秒像素數 (以像素為單位)。這個方法會傳回已設定速率的快速滑過物件。
注意:請使用 GestureDetector.OnGestureListener
和 VelocityTracker
類別分別擷取及計算觸控手勢的速率。
設定動畫值範圍
如要將屬性值限制在特定範圍,您可以設定動畫的最小值和最大值。為具有內建函式範圍 (例如 0 到 1) 的屬性建立動畫時,這個範圍控制項特別實用。
注意:快速滑過動畫的值達到最小值或最大值時,動畫就會結束。
如要設定最小值和最大值,請分別呼叫 setMinValue()
和 setMaxValue()
方法。這兩種方法都會傳回您已設定值的動畫物件。
設定購物阻力
setFriction()
方法可讓您變更動畫的流暢度。可定義動畫中的速度減慢速度。
注意:如果您未在動畫開頭設定阻礙,動畫會使用預設的阻礙值為 1。
這個方法會傳回動畫使用您提供的阻礙值的物件。
程式碼範例
以下範例說明水平快速滑過手勢。從速率追蹤器擷取的速度為 velocityX
,捲動邊界會設定為 0 和 maxScroll。阻礙設定為 1.1。
Kotlin
FlingAnimation(view, DynamicAnimation.SCROLL_X).apply { setStartVelocity(-velocityX) setMinValue(0f) setMaxValue(maxScroll) friction = 1.1f start() }
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X); fling.setStartVelocity(-velocityX) .setMinValue(0) .setMaxValue(maxScroll) .setFriction(1.1f) .start();
設定最低可見變更
為尚未以像素定義的自訂屬性建立動畫時,應設定向使用者呈現動畫值的最小幅度。會決定結束動畫的合理門檻。
在為 DynamicAnimation.ViewProperty
加上動畫效果時,無須呼叫這個方法,因為最小可見變更衍生自屬性。例如:
- 檢視區塊屬性 (例如
TRANSLATION_X
、TRANSLATION_Y
、TRANSLATION_Z
、SCROLL_X
和SCROLL_Y
) 的預設最小可見變更值為 1 像素。 - 若是使用旋轉的動畫 (例如
ROTATION
、ROTATION_X
和ROTATION_Y
),則顯示的最低變化為MIN_VISIBLE_CHANGE_ROTATION_DEGREES
或 1/10 像素。 - 對於使用不透明度的動畫,可見的最低變更數為
MIN_VISIBLE_CHANGE_ALPHA
或 1/256。
如要設定動畫的最小可見變更,請呼叫 setMinimumVisibleChange()
方法,並傳遞其中一個最小可見常數,或是您需要為自訂屬性計算的值。如要進一步瞭解如何計算這個值,請參閱「計算最低可見變更值」一節。
Kotlin
anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE
Java
anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);
注意:只有在為自訂屬性 (像素未定義) 設定動畫時,才需要傳遞值。
計算最小可見變化值
如要計算自訂屬性的最小可見變更值,請使用下列公式:
最小可見變更 = 自訂屬性值的範圍 / 以像素為單位的動畫範圍
舉例來說,您想要為進度 0 到 100 的動畫效果屬性。這與 200 像素的變更相對應。根據公式,可見變更值下限為 100 / 200 等於 0.5 像素。