アニメーションを使用すると、アプリ内で何が起こっているのかを、視覚的な手掛かりを通じてユーザーにわかりやすく伝えることができます。アニメーションは、新しいコンテンツがロードされたときや、新しいアクションが利用可能になったときなど、UI の状態が変化したときに特に役立ちます。また、アニメーションにより、アプリの外観が洗練されたものになり、より高品質な印象を与えることができます。
Android には、必要なアニメーションの種類に応じて、さまざまなアニメーション API が用意されています。このドキュメントでは、UI にモーションを追加するさまざまな方法の概要について説明します。
アニメーションを使用するタイミングについて詳しくは、モーションに関するマテリアル デザイン ガイドもご覧ください。
ビットマップをアニメーション化する
図 1. アニメーション化したドローアブル。
アイコンやイラストなどのビットマップ グラフィックをアニメーション化するには、ドローアブル アニメーション API を使用します。通常、これらのアニメーションはドローアブル リソースを使用して静的に定義されますが、実行時にアニメーションの動作を定義することもできます。
たとえば、2 つのアクションが関連していることをユーザーに伝えるには、再生ボタンをタップすると一時停止ボタンに変化するアニメーションが効果的です。
詳細については、ドローアブル グラフィックをアニメーションにするをご覧ください。
UI の表示とモーションをアニメーション化する
図 2. ダイアログが表示されたり消えたりするときに、控えめなアニメーションを使用すると、UI の変化が不快に感じられなくなります。
レイアウト内のビューの表示 / 非表示や位置を変更する必要がある場合は、UI の変化をユーザーが理解しやすいように、控えめなアニメーションを含めることをおすすめします。
現在のレイアウト内でビューを移動、表示、非表示にするには、android.animation パッケージが提供するプロパティ アニメーション システムを使用します。このシステムは、Android 3.0(API レベル 11)以降で使用できます。これらの API は、一定期間にわたって View オブジェクトのプロパティを更新し、プロパティの変更に応じてビューを継続的に再描画します。たとえば、位置プロパティを変更すると、ビューが画面上で移動します。alpha プロパティを変更すると、ビューがフェードインまたはフェードアウトします。
このようなアニメーションを作成する最も簡単な方法は、レイアウトでアニメーションを有効にすることです。これにより、ビューの可視性を変更すると、アニメーションが自動的に適用されます。詳しくは、レイアウトの更新を自動的にアニメーション化するをご覧ください。
プロパティ アニメーション システムを使用してアニメーションを作成する方法については、プロパティ アニメーションの概要をご覧ください。一般的なアニメーションを作成する方法については、次のページもご覧ください。
物理学ベースのモーション
図 3. ObjectAnimator で作成されたアニメーション。
図 4. 物理ベースの API で作成されたアニメーション。
可能な限り、アニメーションに現実世界の物理現象を適用して、自然に見えるようにします。たとえば、ターゲットが変更されたときに勢いを維持し、変更中にスムーズに移行する必要があります。
このような動作を実現するため、Android サポート ライブラリには、物理法則に基づいてアニメーションの発生を制御する物理ベースのアニメーション API が含まれています。
最も頻繁に利用される物理学ベース アニメーションとしては、次の 2 つがあります。
物理学に基づかないアニメーション(ObjectAnimator API で作成されたアニメーションなど)は、かなり静的で、継続時間が固定されています。ターゲット値が変更された場合は、ターゲット値の変更時にアニメーションをキャンセルし、新しい値を新しい開始値としてアニメーションを再構成して、新しいターゲット値を追加する必要があります。視覚的には、このプロセスにより、図 3 に示すように、アニメーションが突然停止し、その後、不自然な動きになります。
DynamicAnimation などの物理学ベースのアニメーション API で作成されたアニメーションは、力によって駆動されます。目標値が変化すると、力も変化します。新しい力は既存の速度に適用され、新しいターゲットへの継続的な移行が行われます。このプロセスにより、図 4 に示すように、より自然なアニメーションが作成されます。
レイアウトの変更をアニメーション化する
図 5. 詳細を表示するアニメーションは、レイアウトを変更するか、新しいアクティビティを開始することで実現できます。
Android 4.4(API レベル 19)以降では、遷移フレームワークを使用して、現在のアクティビティまたはフラグメント内でレイアウトを入れ替えるときにアニメーションを作成できます。必要な作業は、開始レイアウトと終了レイアウト、使用するアニメーションの種類を指定することだけです。次に、システムが 2 つのレイアウト間のアニメーションを特定して実行します。これを使用して、UI 全体を入れ替えたり、一部のビューのみを移動または置換したりできます。
たとえば、ユーザーがアイテムをタップして詳細情報を表示するときに、図 5 のような遷移を適用して、レイアウトをアイテムの詳細に置き換えることができます。
開始レイアウトと終了レイアウトはそれぞれ Scene に保存されますが、通常、開始シーンは現在のレイアウトから自動的に決定されます。Transition を作成して、必要なアニメーションの種類をシステムに指示してから、TransitionManager.go() を呼び出すと、システムがアニメーションを実行してレイアウトを入れ替えます。
詳細については、遷移を使用してレイアウト変更をアニメーションにするをご覧ください。サンプルコードについては、BasicTransition をご覧ください。
アクティビティ間の切り替えをアニメーション化する
Android 5.0(API レベル 21)以降では、アクティビティ間で遷移するアニメーションを作成することもできます。これは、前のセクションで説明したのと同じ遷移フレームワークに基づいていますが、別のアクティビティのレイアウト間でアニメーションを作成できます。
新しいアクティビティを横からスライドインしたり、フェードインしたりするようなシンプルなアニメーションを適用できます。また、各アクティビティの共有ビュー間で遷移するアニメーションを作成することもできます。たとえば、ユーザーがアイテムをタップして詳細情報を表示するときに、図 5 のアニメーションのように、そのアイテムをシームレスに拡大して画面いっぱいに表示するアニメーションで新しいアクティビティに移行できます。
通常どおり startActivity() を呼び出しますが、ActivityOptions.makeSceneTransitionAnimation() によって提供されるオプションのバンドルを渡します。このオプションのバンドルには、アクティビティ間で共有されるビューが含まれる場合があります。これにより、遷移フレームワークはアニメーション中にそれらのビューを接続できます。
その他のリソースについては、以下をご覧ください。