ビュー アニメーション

Compose を試す
Jetpack Compose は、Android に推奨される UI ツールキットです。Compose でアニメーションを使用する方法について学習します。

ビュー アニメーション システムを使用すると、ビューでトゥイーン アニメーションを実行できます。トゥイーン アニメーションは、始点、終点、サイズ、回転、その他の一般的なアニメーションの要素などの情報を使用して、アニメーションを計算します。

トゥイーン アニメーションでは、View オブジェクトのコンテンツに対して一連の簡単な変換(位置、サイズ、回転、透明度)を実行できます。そのため、TextView オブジェクトがある場合、テキストを移動、回転、拡大、または縮小できます。背景画像がある場合は、テキストとともに背景画像も変換されます。animation package は、トゥイーン アニメーションで使用されるすべてのクラスを提供します。

アニメーション命令のシーケンスは、XML または Android コードで定義されたトゥイーン アニメーションを定義します。レイアウトを定義する場合と同様に XML ファイルを使用することをおすすめします。これは、アニメーションをハードコードするよりも、XML ファイルの方が読みやすく、再利用しやすく、入れ替えやすいためです。下記の例では、XML を使用します(XML ではなくアプリコードでアニメーションを定義する方法について詳しくは、AnimationSet クラスと他の Animation サブクラスをご覧ください)。

アニメーション命令では、実施する変換、そのタイミング、適用にかかる時間を定義します。変換は、順次または同時に行えます。たとえば、TextView のコンテンツを左から右に移動させてから 180 度回転させたり、テキストの移動と回転を同時に行ったりできます。各変換は、その変換に固有のパラメータ セット(サイズ変更の開始サイズと終了サイズ、回転の開始角度と終了角度など)と、一般的なパラメータのセット(たとえば、開始時間と継続時間)を取ります。複数の変換を同時に行うには、同じ開始時間を指定します。順次行うには、開始時間と直前の変換の継続時間を足す計算をします。

アニメーション XML ファイルは、Android プロジェクトの res/anim/ ディレクトリにあります。ファイルには 1 つのルート要素が必要です。ルート要素は、単一の <alpha><scale><translate><rotate>、interpolator 要素、またはこれらの要素のグループを保持する <set> 要素のいずれかです(<set> も含めることができます)。デフォルトでは、すべてのアニメーション命令が同時に適用されます。それらを順次処理するには、次の例に示すように startOffset 属性を指定する必要があります。

ApiDemos の以下のいずれかの XML を使用して、ビュー オブジェクトの拡大と回転を同時に行います。

<set 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/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>

画面の座標(この例では使用されていません)は左上隅が(0,0)で、右下に進むにつれて増加します。

pivotX など一部の値は、オブジェクト自体または親に対して相対的に指定できます。適切な形式を使用してください(親に対して相対的に 50% の場合は「50」、自身に対して 50% の場合は「50%」)。

Interpolator を割り当てることで、時間の経過に沿って変換を適用する方法を決定できます。Android には、さまざまな速度曲線を指定する Interpolator サブクラスがいくつか用意されています。たとえば、AccelerateInterpolator は、開始して速度を上げるように変換に指示します。それぞれに、XML に適用できる属性値があります。

この XML をプロジェクトの res/anim/ ディレクトリに hyperspace_jump.xml として保存すると、次のコードはこれ参照して、レイアウトから ImageView オブジェクトに適用します。

Kotlin

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation ->
    findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation)
}

Java

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

startAnimation() の代わりに、Animation.setStartTime() を使用してアニメーションの開始時間を定義してから、View.setAnimation() を使用してアニメーションをビューに割り当てることもできます。

XML 構文、使用可能なタグと属性の詳細については、アニメーション リソースをご覧ください。

注: アニメーションの移動やサイズ変更の方法にかかわらず、アニメーションを保持する View の境界は、それに合わせて自動的に調整されることはありません。アニメーションは引き続きビューの境界を越えて描画され、クリップされません。ただし、アニメーションが親ビューの境界を越えるとクリッピングが発生します