Android のグラフィックスとアニメーション

Android には、2D グラフィックスとアニメーションをサポートするための非常に豊富で多様なフレームワークが用意されています。 このトピックでは、これらのフレームワークを紹介し、Xamarin.Android アプリケーションで使用するカスタム グラフィックスとアニメーションを作成する方法について説明します。

概要

従来は電力が限られているデバイスで実行されているにもかかわらず、最も高い評価を受けたモバイル アプリケーションには、直感的で応答性の高い動的な操作性を提供する、高品質のグラフィックスとアニメーションを備えた高度なユーザー エクスペリエンス (UX) が用意されていることがよくあります。 モバイル アプリケーションがますます高度になるにつれて、ユーザーはアプリケーションにさらに多くのことを期待するようになっています。

幸いにも、最新のモバイル プラットフォームには、使いやすさを維持しながら、高度なアニメーションとカスタム グラフィックスを作成するための非常に強力なフレームワークがあります。 これにより、開発者はほとんど労力をかけずに豊富なインタラクティビティを追加することができます。

Android の UI API フレームワークは、グラフィックスとアニメーションの 2 つのカテゴリに大きく分けることができます。

グラフィックスについては、2D および 3D グラフィックスを実行するためのさまざまなアプローチにさらに分割されます。 3D グラフィックスを使用するには、OpenGL ES (モバイル固有バージョンの OpenGL) などの組み込みフレームワークや、MonoGame (XNA ツールキットと互換性のあるクロス プラットフォーム ツールキット) などのサードパーティ製フレームワークを利用します。 この記事では、3D グラフィックスについては取り上げませんが、組み込みの 2D 描画手法については説明します。

Android には、2D グラフィックスを作成するための 2 つの異なる API が用意されています。 1 つは高レベルの宣言型アプローチで、もう 1 つはプログラムによる低レベル API です。

  • ドローアブル リソース – プログラムによって、または (より一般的には) XML ファイルに描画命令を埋め込むことで、カスタム グラフィックスを作成するときに使用されます。 ドローアブル リソースは通常、Android が 2D グラフィックをレンダリングするための命令またはアクションを含む XML ファイルとして定義されます。

  • キャンバス – 基になるビットマップに直接描画する低レベルの API です。 表示される内容を非常に細かく制御できます。

Android には、このような 2D グラフィックス手法のほか、アニメーションを作成するさまざまな方法もいくつか用意されています。

  • ドローアブル アニメーション – Android では、"ドローアブル アニメーション" と呼ばれるフレームごとのアニメーションもサポートされています。 これは最もシンプルなアニメーション API です。 Android により、ドローアブル リソースが順番に読み込まれ、表示されます (漫画とよく似ています)。

  • ビュー アニメーション – "ビュー アニメーション" は、Android の元のアニメーション API であり、Android のすべてのバージョンで使用できます。 この API には制限があり、ビュー オブジェクトでのみ機能し、それらのビューに対してのみシンプルな変換を実行できます。 ビュー アニメーションは通常、/Resources/anim フォルダーにある XML ファイルで定義されます。

  • プロパティ アニメーション – Android 3.0 では、"プロパティ アニメーション" と呼ばれる新しいアニメーション API セットが導入されました。 このような新しい API によって、ビュー オブジェクトだけでなく、あらゆるオブジェクトのプロパティのアニメーション化に使用できる、拡張可能で柔軟なシステムが導入されました。 この柔軟性によりアニメーションを個別のクラスにカプセル化でき、コードの共有が容易になります。

ビュー アニメーションは、Android 3.0 より前の古い API (API レベル 11) をサポートする必要があるアプリケーションに適しています。 それ以外の場合は、上記の理由から、アプリケーションでは新しいプロパティ アプリケーション API を使用する必要があります。

これらのフレームワークはすべて実行可能なオプションですが、プロパティ アニメーションの方がより柔軟に操作できるため、可能な場合はこちらの API を優先してください。 プロパティ アニメーションを使用すると、アニメーション ロジックを個別のクラスにカプセル化できるため、コード共有が容易になり、コードのメンテナンスが簡素化されます。

アクセシビリティ

グラフィックスやアニメーションは、Android アプリを楽しく使える魅力的なものにするのに役立ちますが、スクリーンリーダーや代替入力デバイス、支援付きズームを介したインタラクションがあることも忘れてはなりません。 また、インタラクションの中には、オーディオ機能がない場合もあります。

ユーザー インターフェイスでヒントとナビゲーション補助を提供する、UI の画像要素にテキスト コンテンツや説明が確実に存在するようにする、といったアクセシビリティを考慮して設計されていれば、このような状況で、アプリはより使いやすいものになります。

Android のアクセシビリティ API を利用する方法の詳細については、Google のアクセシビリティ ガイドを参照してください。

2D グラフィックス

ドローアブル リソースは、Android アプリケーションで一般的な手法です。 他のリソースと同様、ドローアブル リソースは宣言型であり、XML ファイルで定義されています。 このアプローチにより、リソースからコードを明確に分離できます。 これにより開発とメンテナンスを簡素化できます。コードを変更せずに、Android アプリケーションでグラフィックスを更新または変更できるためです。 しかし、ドローアブル リソースは、多くのシンプルかつ一般的なグラフィック要件には便利ですが、キャンバス API のパワーとコントロールが不足しています。

キャンバス オブジェクトを使用するもう 1 つの手法は、他の従来の API フレームワーク、たとえば System.Drawing や iOS の Core Drawing とよく似ています。 キャンバス オブジェクトを使用すると、2D グラフィックスの作成方法を最も制御できます。 これは、ドローアブル リソースが機能しない、操作しにくい、といった状況に適しています。 たとえば、スライダーの値に関連する計算に基づいて外観が変わるカスタム スライダー コントロールを描画しなければならないことがあります。

まずは、ドローアブル リソースを確認してみましょう。 これはよりシンプルであり、最も一般的なカスタム描画ケースに対応します。

ドローアブル リソース

ドローアブル リソースは、ディレクトリ /Resources/drawable の XML ファイルで定義されます。 PNG または JPEG の埋め込みとは異なり、ドローアブル リソースの密度固有のバージョンを提供する必要はありません。 実行時に、Android アプリケーションはこれらのリソースを読み込み、その XML ファイルに含まれている手順を使用して、2D グラフィックスを作成します。 Android では、さまざまな種類のドローアブル リソースが定義されています。

  • ShapeDrawable – プリミティブな幾何シェイプを描画し、限られた一連のグラフィック効果をそのシェイプに適用するドローアブル オブジェクトです。 ボタンをカスタマイズしたり TextViews の背景を設定したりするのに非常に便利です。 ShapeDrawable を使用する方法の例については、この記事の後半で説明します。

  • StateListDrawable – ウィジェット/コントロールの状態に基づいて外観を変更するドローアブル リソースです。 たとえば、ボタンが押されているかどうかに応じて、ボタンの外観が変わる場合があります。

  • LayerDrawable – ドローアブル リソースが順番に上に積み重ねられていきます。 LayerDrawable の例を次のスクリーンショットに示します。

    LayerDrawable example

  • TransitionDrawable – これは LayerDrawable ですが、1 つの違いがあります。 TransitionDrawable では、あるレイヤーが別のレイヤーの上に表示される様子をアニメーション化できます。

  • LevelListDrawable – 特定の条件に基づいて画像を表示するという点で StateListDrawable によく似ています。 ただし、LevelListDrawable は、StateListDrawable とは異なり、整数値に基づいて画像を表示します。 LevelListDrawable の例が WiFi 信号の強度の表示です。 WiFi 信号の強度の変化に応じて、表示されるドローアブル リソースが変わります。

  • ScaleDrawable/ClipDrawable – 名前が示すように、このドローアブル リソースはスケーリングとクリッピングの両方の機能を提供します。 ScaleDrawable は別のドローアブル リソースをスケーリングし、ClipDrawable は別のドローアブル リソースをクリップします。

  • InsetDrawable – このドローアブル リソースは、別のドローアブル リソースの側面にインセットを適用します。 これは、ビューに必要な背景が、ビューの実際の境界よりも小さい場合に使用されます。

  • XML BitmapDrawable – このファイルは、実際のビットマップに対して実行される一連の命令 (XML) です。 Android で実行できるアクションには、並べて表示、ディザリング、アンチエイリアシングなどがあります。 この使い方として非常に一般的なものの 1 つが、レイアウトの背景全体にビットマップを並べて表示することです。

ドローアブル リソースの例

ShapeDrawable を使用して 2D グラフィックを作成する簡単な例を見てみましょう。 ShapeDrawable では、四角形、楕円、線、リングの 4 つの基本的なシェイプのいずれかを定義できます。 グラデーション、色、サイズなどの基本的な効果を適用することもできます。 次の XML は ShapeDrawable です。これは AnimationsDemo コンパニオン プロジェクト (Resources/drawable/shape_rounded_blue_rect.xml ファイル内) にあります。 これにより、紫色のグラデーションの背景と、角が丸い四角形が定義されます。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!-- Specify a gradient for the background -->
<gradient android:angle="45"
          android:startColor="#55000066"
          android:centerColor="#00000000"
          android:endColor="#00000000"
          android:centerX="0.75" />

<padding android:left="5dp"
          android:right="5dp"
          android:top="5dp"
          android:bottom="5dp" />

<corners android:topLeftRadius="10dp"
          android:topRightRadius="10dp"
          android:bottomLeftRadius="10dp"
          android:bottomRightRadius="10dp" />
</shape>

次の XML に示すように、このドローアブル リソースは、レイアウトまたは他のドローアブル リソースで宣言的に参照できます。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#33000000">
    <TextView android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerInParent="true"
              android:background="@drawable/shape_rounded_blue_rect"
              android:text="@string/message_shapedrawable" />
</RelativeLayout>

ドローアブル リソースを、プログラムによって適用することもできます。 次のコード スニペットは、TextView の背景をプログラムによって設定する方法を示しています。

TextView tv = FindViewById<TextView>(Resource.Id.shapeDrawableTextView);
tv.SetBackgroundResource(Resource.Drawable.shape_rounded_blue_rect);

この外観を確認するには、AnimationsDemo プロジェクトを実行し、メイン メニューからシェイプ ドローアブルの項目を選択します。 次のスクリーンショットのような画面が表示されます。

Textview with a custom background, drawable with a gradient and rounded corners

ドローアブル リソースの XML 要素と構文の詳細については、Google のドキュメントを参照してください。

キャンバス描画 API の使用

ドローアブル リソースは強力ですが、制限があります。 処理によっては不可能だったり、非常に複雑だったりします (デバイスのカメラで撮影された画像へのフィルターの適用など)。 ドローアブル リソースを使用して、赤目補正を適用することは非常に困難です。 代わりに、キャンバス API を使用すると、アプリケーションで非常にきめ細かい制御が可能になり、画像の特定の部分の色を選択して変更することができます。

キャンバスで一般的に使用されるクラスの 1 つが、Paint クラスです。 このクラスは、描画方法に関する色とスタイルの情報を保持します。 これは色や透明度などを提供するために使用されます。

キャンバス API では、2D グラフィックスの描画に "ペインターのモデル" が使用されます。 操作は、重なり合った連続するレイヤーに適用されます。 各操作によって、その下のビットマップの領域の一部がカバーされます。 その領域が、前に塗られた領域と重なると、古い領域は、新しいペイントによって部分的または完全に隠されます。 これは、System.Drawing や iOS の Core Graphics など、他の多くの描画 API と同じしくみです。

Canvas オブジェクトを取得する方法は 2 つあります。 最初の方法では、Bitmap オブジェクトを定義し、それを使用して Canvas オブジェクトをインスタンス化します。 たとえば、次のコード スニペットでは、基になるビットマップを含むキャンバスを新しく作成します。

Bitmap bitmap = Bitmap.CreateBitmap(100, 100, Bitmap.Config.Argb8888);
Canvas canvas = new Canvas(b);

Canvas オブジェクトを取得するもう 1 つの方法は、View 基底クラスが用意されている OnDraw コールバック メソッドです。 Android は、ビューがビュー自体を描画する必要があると判断したときにこのメソッドを呼び出し、操作するビューに対して Canvas オブジェクトを渡します。

Canvas クラスは、プログラムによって描画命令を提供するメソッドを公開します。 次に例を示します。

  • Canvas.DrawPaint – 指定したペイントで、キャンバスのビットマップ全体を塗りつぶします。

  • Canvas.DrawPath – 指定したペイントを使用して、指定した幾何シェイプを描画します。

  • Canvas.DrawText – 指定した色で、キャンバスにテキストを描画します。 テキストは位置 x,y に描画されます。

キャンバス API を使用した描画

キャンバス API の動作例を次に示します。 次のコード スニペットは、ビューを描画する方法を示しています。

public class MyView : View
{
    protected override void OnDraw(Canvas canvas)
    {
        base.OnDraw(canvas);
        Paint green = new Paint {
            AntiAlias = true,
            Color = Color.Rgb(0x99, 0xcc, 0),
        };
        green.SetStyle(Paint.Style.FillAndStroke);

        Paint red = new Paint {
            AntiAlias = true,
            Color = Color.Rgb(0xff, 0x44, 0x44)
        };
        red.SetStyle(Paint.Style.FillAndStroke);

        float middle = canvas.Width * 0.25f;
        canvas.DrawPaint(red);
        canvas.DrawRect(0, 0, middle, canvas.Height, green);
    }
}

上記のコードは、最初に赤いペイントと緑のペイント オブジェクトを作成します。 これは、キャンバスのコンテンツを赤で塗りつぶしてから、キャンバスの幅の 25% の四角形を緑色で描画するようキャンバスに指示します。 この例は、この記事のソース コードに含まれている AnimationsDemo プロジェクトで確認できます。 アプリケーションを起動し、メイン メニューから描画項目を選択すると、次のような画面になります。

Screen with red paint and green paint objects

アニメーション

ユーザーは、アプリケーション内で動くものを好みます。 アニメーションは、アプリケーションのユーザー エクスペリエンスを向上させ、際立たせる優れた方法です。最適なアニメーションとは、自然に感じられるためユーザーに気付かれないものです。 Android には、次の 3 つの API がアニメーション用に用意されています。

  • ビュー アニメーション – 元の API です。 これらのアニメーションは特定のビューに関連付けられており、ビューのコンテンツに対してシンプルな変換を実行できます。 この API はシンプルであるため、引き続きアルファ アニメーションや回転などに役立ちます。

  • プロパティ アニメーション – プロパティ アニメーションは Android 3.0 で導入されました。 これにより、アプリケーションが、ほぼすべてのものをアニメーション化できるようになります。 プロパティ アニメーションを使用すると、あらゆるオブジェクトのあらゆるプロパティを、そのオブジェクトが画面に表示されていない場合でも変更できます。

  • ドローアブル アニメーション – 非常にシンプルなアニメーション効果をレイアウトに適用するときに使用される、特別なドローアブル リソースです。

一般的には、より柔軟性が高く、より多くの機能が用意されているプロパティ アニメーションを使用することをお勧めします。

ビュー アニメーション

ビュー アニメーションはビューに限定されており、始点と終点、サイズ、回転、透明度などの値に対してのみアニメーションを実行できます。 この種類のアニメーションは、通常、"トゥイーン アニメーション"と呼ばれます。 ビュー アニメーションは 2 つの方法で定義できます。コード内でプログラムを使用する方法と、XML ファイルを使用する方法です。 ビュー アニメーションを宣言する場合は、読みやすく、メンテナンスが容易な XML ファイルを使用することをお勧めします。

アニメーション XML ファイルは、Xamarin.Android プロジェクトの /Resources/anim ディレクトリに保存されます。 このファイルには、ルート要素として次のいずれかの要素が必要です。

  • alpha - フェードインまたはフェードアウトのアニメーション。

  • rotate – 回転のアニメーション。

  • scale – サイズ変更のアニメーション。

  • translate – 水平/垂直の動き。

  • set – 1 つ以上の他のアニメーション要素を保持できるコンテナー。

既定では、XML ファイル内のすべてのアニメーションが同時に適用されます。 アニメーションを順番に実行するには、上記で定義した要素のいずれかで android:startOffset 属性を設定します。

"補間機能" を使用することで、アニメーションの変化率に影響を与えることができます。 補間機能により、アニメーション効果の加速、繰り返し、減速が可能になります。 Android フレームワークには、次のような補間機能が用意されています (ただし、これらに限定されません)。

  • AccelerateInterpolator / DecelerateInterpolator – この補間機能はアニメーションの変化率を増減します。

  • BounceInterpolator – 変化は最後にバウンスします。

  • LinearInterpolator – 変化率は一定です。

次の XML は、これらの要素の一部を組み合わせたアニメーション ファイルの例を示しています。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android=http://schemas.android.com/apk/res/android
     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:fillEnabled="true"
           android:fillAfter="false"
           android:duration="700" />

    <set android:interpolator="@android:anim/accelerate_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:fillEnabled="true"
               android:fillBefore="false"
               android:fillAfter="true"
               android:startOffset="700"
               android:duration="400" />

        <rotate android:fromDegrees="0"
                android:toDegrees="-45"
                android:toYScale="0.0"
                android:pivotX="50%"
                android:pivotY="50%"
                android:fillEnabled="true"
                android:fillBefore="false"
                android:fillAfter="true"
                android:startOffset="700"
                android:duration="400" />
    </set>
</set>

このアニメーションでは、すべてのアニメーションが同時に実行されます。 最初のスケール アニメーションでは、画像が水平方向に拡大、垂直方向に縮小した後、45 度反時計回りに回転しながら縮小し、画面から消えます。

プログラムによってアニメーションをビューに適用するには、アニメーションを拡大してから、ビューに適用します。 Android には、ヘルパー クラス Android.Views.Animations.AnimationUtils が用意されています。これはアニメーション リソースを拡大してから、Android.Views.Animations.Animation のインスタンスを返します。 このオブジェクトは、StartAnimation を呼び出して、Animation オブジェクトを渡すことによって、ビューに適用されます。 次のコード スニペットは、この例を示しています。

Animation myAnimation = AnimationUtils.LoadAnimation(Resource.Animation.MyAnimation);
ImageView myImage = FindViewById<ImageView>(Resource.Id.imageView1);
myImage.StartAnimation(myAnimation);

これでビュー アニメーションのしくみを基本的に理解できました。次は、プロパティ アニメーションを見ていきましょう。

プロパティ アニメーション

プロパティ アニメーターは、Android 3.0 で導入された新しい API です。 これは、あらゆるオブジェクトのあらゆるプロパティのアニメーション化に使用できる、より拡張性に優れた API を提供します。

プロパティ アニメーションはすべて、Animator サブクラスのインスタンスによって作成されます。 アプリケーションはこのクラスを直接使用するのではなく、そのサブクラスのいずれかを使用します。

  • ValueAnimator – このクラスは、プロパティ アニメーション API 全体で最も重要なクラスです。 これにより、変更が必要なプロパティの値が計算されます。 ViewAnimator は、これらの値を直接更新するのではなく、アニメーション化されたオブジェクトの更新に使用できるイベントを発生させます。

  • ObjectAnimator – このクラスは ValueAnimator のサブクラスです。 その目的は、更新するターゲット オブジェクトとプロパティを受け入れることにより、オブジェクトをアニメーション化するプロセスを簡素化することです。

  • AnimationSet – このクラスは、アニメーションがどのように関連し合い、実行されるかを調整する役割を担っています。 アニメーションは、同時または順番に実行することも、次の実行までの時間を指定して実行することもできます。

"エバリュエーター" は、アニメーション中に新しい値を計算するために、アニメーターによって使用される特別なクラスです。 Android に用意されている、すぐに利用できるエバリュエーターは次のとおりです。

  • IntEvaluator – 整数プロパティの値を計算します。

  • FloatEvaluator – 浮動小数点数プロパティの値を計算します。

  • ArgbEvaluator – 色プロパティの値を計算します。

アニメーション化されているプロパティが、floatint、または色でない場合、アプリケーションは、ITypeEvaluator インターフェイスを実装して、独自のエバリュエーターを作成できます (カスタム エバリュエーターの実装については、このトピックでは扱いません)。

ValueAnimator の使用

どのアニメーションにも 2 つの要素があります。アニメーション化された値を計算する要素と、その値をオブジェクトのプロパティに設定する要素です。 ValueAnimator は値を計算するだけで、オブジェクトに直接作用することはありません。 代わりに、オブジェクトは、アニメーションの有効期間中に呼び出されるイベント ハンドラー内で更新されます。 この設計では、1 つのアニメーション値から複数のプロパティを更新することができます。

ValueAnimator のインスタンスを取得するには、次のファクトリ メソッドのいずれかを呼び出します。

  • ValueAnimator.OfInt
  • ValueAnimator.OfFloat
  • ValueAnimator.OfObject

これが完了したら、ValueAnimator インスタンスには期間が設定されているはずなので、インスタンスを開始できます。 次の例は、1000 ミリ秒の 0 から 1 の値をアニメーション化する方法を示しています。

ValueAnimator animator = ValueAnimator.OfInt(0, 100);
animator.SetDuration(1000);
animator.Start();

ただし、上記のコード スニペット自体はあまり役に立ちません。アニメーターは実行されますが、更新された値のターゲットがありません。 Animator クラスは、リスナーに新しい値を通知する必要があると判断すると、更新イベントを発生させます。 次のコード スニペットに示すように、アプリケーションはイベント ハンドラーを提供することで、このイベントに応答できます。

MyCustomObject myObj = new MyCustomObject();
myObj.SomeIntegerValue = -1;

animator.Update += (object sender, ValueAnimator.AnimatorUpdateEventArgs e) =>
{
    int newValue = (int) e.Animation.AnimatedValue;
    // Apply this new value to the object being animated.
    myObj.SomeIntegerValue = newValue;
};

ValueAnimator のことは理解できました。次は ObjectAnimator について詳しく確認しましょう。

ObjectAnimator の使用

ObjectAnimator は、ValueAnimator のタイミング エンジンと値の計算を、イベント ハンドラーの接続に必要なロジックと結び付ける ViewAnimator のサブクラスです。 ValueAnimator では、アプリケーションが、イベント ハンドラーを明示的に接続する必要があります。このステップは、ObjectAnimator によって行われます。

ObjectAnimator の API は ViewAnimator の API とよく似ていますが、更新するオブジェクトとプロパティ名を指定する必要があります。 次の例は、ObjectAnimator の使用例を示しています。

MyCustomObject myObj = new MyCustomObject();
myObj.SomeIntegerValue = -1;

ObjectAnimator animator = ObjectAnimator.OfFloat(myObj, "SomeIntegerValue", 0, 100);
animator.SetDuration(1000);
animator.Start();

前のコード スニペットからわかるように、ObjectAnimator は、オブジェクトのアニメーション化に必要なコードを減らし、簡素化することができます。

ドローアブル アニメーション

最後のアニメーション API はドローアブルアニメーション API です。 ドローアブル アニメーションは、一連のドローアブル リソースを 1 つずつ読み込み、順番に表示していくもので、パラパラ漫画と似ています。

ドローアブル リソースは XML ファイルで定義され、その XML ファイルには、ルート要素である <animation-list> 要素と、アニメーション内の各フレームを定義する一連の <item> 要素が含まれています。 この XML ファイルは、アプリケーションの /Resource/drawable フォルダーに保存されます。 次の XML は、ドローアブル アニメーションの例です。

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/asteroid01" android:duration="100" />
  <item android:drawable="@drawable/asteroid02" android:duration="100" />
  <item android:drawable="@drawable/asteroid03" android:duration="100" />
  <item android:drawable="@drawable/asteroid04" android:duration="100" />
  <item android:drawable="@drawable/asteroid05" android:duration="100" />
  <item android:drawable="@drawable/asteroid06" android:duration="100" />
</animation-list>

このアニメーションは、6 つのフレームで実行されます。 android:duration 属性は、各フレームの表示時間を宣言します。 次のコード スニペットは、ドローアブル アニメーションを作成し、ユーザーが画面上のボタンをクリックしたときに、それを開始する例を示しています。

AnimationDrawable _asteroidDrawable;

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);

    _asteroidDrawable = (Android.Graphics.Drawables.AnimationDrawable)
    Resources.GetDrawable(Resource.Drawable.spinning_asteroid);

    ImageView asteroidImage = FindViewById<ImageView>(Resource.Id.imageView2);
    asteroidImage.SetImageDrawable((Android.Graphics.Drawables.Drawable) _asteroidDrawable);

    Button asteroidButton = FindViewById<Button>(Resource.Id.spinAsteroid);
    asteroidButton.Click += (sender, e) =>
    {
        _asteroidDrawable.Start();
    };
}

この時点で、Android アプリケーションで使用できるアニメーション API の基礎の説明は完了しました。

まとめ

この記事では、Android アプリケーションにグラフィックスを追加するのに役立つ新しい概念や API を多数紹介してきました。 まず、さまざまな 2D グラフィックス API について説明し、Android でキャンバス オブジェクトを使用して、アプリケーションからどのように画面に直接描画できるかを示しました。 また、XML ファイルを使用してグラフィックスを宣言的に作成する代替手法もいくつか見てきました。 そして、Android でアニメーションを作成するための古い API と新しい API について説明しました。