以 Fling 為基礎的動畫會使用與物件速度成正比的摩擦力。您可以使用這項功能為物件的屬性製作動畫,並逐步結束動畫。一開始會獲得動量 (主要來自手勢速度),然後逐漸減緩。當動畫速度夠慢,裝置螢幕上不會出現明顯變化時,動畫就會停止。

如要瞭解相關主題,請參閱下列指南:
新增 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 為單位定義值,可讓速度不受裝置密度和外型規格影響。如要進一步瞭解如何將起始速度轉換為每秒像素數,請參閱「彈簧動畫」中的「將每秒 dp 轉換為每秒像素數」一節。
如要設定速度,請呼叫 setStartVelocity()
方法,並傳遞以每秒像素為單位的速度。這個方法會傳回設定速度的甩動物件。
注意:請分別使用 GestureDetector.OnGestureListener
和 VelocityTracker
類別,擷取及計算觸控手勢的速度。
設定動畫值範圍
如要將屬性值限制在特定範圍內,可以設定動畫的最小值和最大值。如果動畫屬性具有內建範圍 (例如 Alpha 值介於 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 像素。