使用快速滑過動畫移動檢視畫面

嘗試 Compose 方法
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 Compose 中使用動畫。

快速滑過動畫會使用與物件速率成正比的阻力。可用來為物件的屬性建立動畫,並逐步結束動畫。這種物件具有初始動量,主要是從手勢速度接收,並逐漸減慢。當動畫速率夠低,導致裝置螢幕未顯示任何變化時,動畫就會進入結尾。

圖 1. 閃爍動畫

如要瞭解相關主題,請參閱下列指南:

新增 AndroidX 程式庫

如要使用以物理為基礎的動畫,您必須將 AndroidX 程式庫新增至專案,如下所示:

  1. 開啟應用程式模組的 build.gradle 檔案。
  2. 將 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);

設定速率

起始速度會定義動畫屬性在動畫開始時變更的速度。預設的起始速度為每秒 0 個像素。因此,您必須定義開始速度,以確保動畫不會立即結束。

您可以將固定值設為啟動速度,也可以根據觸控手勢的速度進行設定。如果選擇提供固定值,則應以每秒 dp 為單位定義這個值,然後將其轉換為每秒像素數。並以每秒 dp 為單位定義值,可將速率與裝置的密度和板型規格無關。如要進一步瞭解如何將起始速度轉換為每秒像素數,請參閱 Spring Animation每秒 dp 轉換為每秒像素一節。

如要設定速率,請呼叫 setStartVelocity() 方法,並傳遞每秒像素的速度 (以像素為單位)。這個方法會傳回已設定速率的快速滑過物件。

注意:請使用 GestureDetector.OnGestureListenerVelocityTracker 類別,分別擷取及計算觸控手勢的速度。

設定動畫值範圍

如果您想要將屬性值限制在特定範圍,可以設定最小和最大動畫值。當您為具有內建範圍的屬性 (例如 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_XTRANSLATION_YTRANSLATION_ZSCROLL_XSCROLL_Y) 的最小可見變更值為 1 像素。
  • 使用旋轉功能的動畫 (例如 ROTATIONROTATION_XROTATION_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 像素。