Android Dev Summit 2018のセッション Get Animated が、AndroidのアニメーションAPIのまとめとして素晴らしかったのですが、Googleのセッションの常として、YouTube動画はあるけれどスライド資料がなかったので、メモがてら要点をまとめました。
アニメーションAPI一覧
API名 | APIレベル |
---|---|
View Animations | 1+ |
Value Animator | 11+ |
Object Animator | 11+ |
View Property Animator | 12+ |
Animated Vector Drawable | 21+ (AndroidXライブラリにより14+で利用可能1) |
Physics (AndroidX) | 14+2 |
Transitions | 19+ (AndroidXライブラリにより14+で利用可能) |
Motion Layout (AndroidX) | 18+ |
どのAPIを使うべきかの判断フロー
- 複数のViewが関係する複雑なアニメーション、かつ、ユーザー操作に応じたアニメーション
→ Motion Layout - 途中で中断する可能性がある、かつ、ユーザー操作に応じたアニメーション
→ Physics - Activity/Fragment遷移時のShared elementなど、ウィンドウ内容のアニメーション
→ Transitions - ベクター画像のアニメーション
→ Animated Vector Drawable - ウィンドウ全体のアニメーション
→ View Animations - Viewプロパティのアニメーション
→ View Property Animator - Viewプロパティ以外のカスタムアニメーション3
→ Value Animator - 汎用的なプロパティアニメーション
→ Object Animator
View Animations
-
ViewのDrawパスで実行されるので、必ずViewのサイズが計測済みの状況で実行される、という特徴がある
- そのため、
10%
などの相対サイズ表現が使える
- そのため、
-
リソースXMLは
res/anim
フォルダに配置する<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromYDelta="0" android:toYDelta="-2%" android:interpolator="@interpolator/fast_out_slow_in" android:duration="425"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.9" android:interpolator="@interpolator/linear" android:duration="117"/> </set>
-
以下のケースで必要になるが、それ以外では使う必要はない
- Windowアニメーション
- Fragmentアニメーション (サイズの計測後に開始する必要があるアニメーションだけ)
Animator
- android.animation
- リソースXMLは
res/animator
フォルダに配置する - Animator関連のAPIは、以下のような関係を持つ
(Get Animated (Android Dev Summit '18) - YouTube より)
Value Animator
-
オブジェクトのプロパティではない、独立した値を変化させて、アニメーションを実装するときに使う
-
変化前後の値や、アニメーション時間など、リソースXMLでは
animator
タグで定義できる<animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:repeatCount="1" android:repeatMode="reverse"/>
-
コードでは、次のように定義・実行できる
ValueAnimator.ofInt(0, 4).apply { repeatCount = 10 duration = 1000 addUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as Int // ... } }
Object Animator
-
Viewに限らず、何らかのオブジェクトのプロパティ変化で表現できるアニメーションの実装に使う
-
変化前後のプロパティ値や、プロパティの名前、アニメーション時間など、リソースXMLでは
objectAnimator
タグで定義できる<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueTo="200" android:valueType="floatType" android:propertyName="y" android:repeatCount="1" android:repeatMode="reverse"/>
-
コードでは、次のように定義・実行できる
ObjectAnimator.ofFloat(view, View.ALPHA, 1f, 0f).apply { duration = 100 }.start()
-
PropertyValuesHolder
(APIレベル23+) を使うと、複数のプロパティを同時にアニメーションできるval scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.5f, 1f) val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.5f, 1f) val alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 0f, 1f) ObjectAnimator.ofPropertyValuesHolder(view, scaleX, scaleY, alpha).apply { duration = 100 }.start()
-
AnimatorSet
を使うと、複数のAnimator
を協調して実行できる
View Property Animator
-
View.animate()
でViewPropertyAnimator
のインスタンスを取得し、実行するview.animate() .scaleX(1f).scaleY(1f).alpha(1f) .setInterpolator(OvershootInterpolator()) .start()
-
単一のViewに対して、シングルショットのアニメーションを実行する場合に向いている
Animated Vector Drawable
- AnimatedVectorDrawable (AndroidX: AnimatedVectorDrawableCompat)
- Vector DrawableとAnimatorをセットにしたもの。Vector Drawableのプロパティを、Animatorでアニメーションさせている
- Android 7.0 (APIレベル25) 以降では、アニメーションがUIスレッドでなくRenderスレッドで実行されるので、アニメーションのジャンクが起こりづらくなっている
Physics
- Physics-based motion
- 慣性を考慮したアニメーションを実装するためのAPI
(Animations Overview | Android Developers より)
Transitions
-
android.transition (AndroidX: androidx.transition)
-
Viewレイアウトの変化をアニメーションさせるためのAPI
-
Transitionの内容は、コードや、
res/transition
に配置するXMLで定義できる<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:transitionOrdering="sequential"> <fade android:fadingMode="fade_out" /> <changeBounds /> <fade android:fadingMode="fade_in" /> </transitionSet>
-
Activity/Fragment遷移時に、ウィンドウの内容をアニメーションするときにも利用する
(Restitching Plaid – Nick Butcher – Medium より)
Motion Layout
- MotionLayout
- MotionLayout は ConstraintLayout の派生クラス
-
ConstraintLayout
内の子ViewのConstraint (ConstraintSet
) を複数定義して、その間をなめらかにアニメーションすることができる
(Introduction to MotionLayout (part III) – Google Developers – Medium より)
-
古いバージョンのサポートライブラリを使えば、APIレベル7+に遡ってサポート可能です ↩
-
サポートしているバージョンに関する記述が見つからなかったので、全AndroidXライブラリの最低サポートバージョンであるAPIレベル14+が適用されると判断しました ↩
-
セッションではこの順序で紹介されていたのですが、7 (Value Animator) と8 (Object Animator) の順序が逆なのでは、と思います。つまり、まずObject Animatorが使えないか検討して、使えないケースでValue Animatorを使うことになるのかな、と ↩