Android 11 のデベロッパー プレビューが公開されました。ぜひお試しのうえ、フィードバックをお寄せください

ビュー アニメーション

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

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

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

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

アニメーション XML ファイルは、Android プロジェクトの res/anim/ ディレクトリにあります。ファイルには単一のルート要素が必要です。ルート要素は、単一の <alpha><scale><translate><rotate>、補完要素、またはこれらの要素のグループを保持する <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 構文、使用可能なタグと属性の詳細については、アニメーション リソースをご覧ください。

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