フリング アニメーションを使用してビューを移動する

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);

速度を設定する

開始速度は、アニメーションの開始時にアニメーション プロパティが変化する速度を定義します。デフォルトの開始速度は 1 秒あたり 0 ピクセルに設定されています。そのため、アニメーションがすぐに終了しないように、開始速度を定義する必要があります。

開始速度として固定値を使用することも、タップ操作の速度を基準にすることもできます。固定値を指定する場合は、1 秒あたりの dp で値を定義してから、1 秒あたりのピクセルに変換する必要があります。値を 1 秒あたりの dp で定義すると、速度をデバイスの密度やフォーム ファクタに依存しないようにできます。初速度を 1 秒あたりのピクセル数に変換する方法について詳しくは、スプリング アニメーションの1 秒あたりの dp を 1 秒あたりのピクセル数に変換するをご覧ください。

速度を設定するには、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 ピクセルです。