2016年9月19日月曜日

独自で2Dアニメーションを実装するベストプラクティス

2Dアニメーションを行いたい!

といった場合、Androidにはいくつもの方法が存在します。

  • Animationクラスを使用
  • ObjectAnimatorクラスを使用
  • ViewPropertyAnimatorクラスを使用
  • SurfaceViewクラスを使用


AnimationクラスはAPI Level1からあるレガシーなAPIですが、jniのオーバヘッドが大きく、またAnimationSetで複数のアニメーションを同時実行しようした場合、それぞれが独立して動作するためパフォーマンスが良くありません。Googleはこれを早くdeprecatedにするべきです。

SurfaceViewはViewのレンダリングがHWアクセラレーションに対応してからその存在意義がなくなりました。これもdeprecatedになるべきです。

結果的に今使うべきはObjectAnimatorかViewPropertyAnimatorに絞られるわけですが、標準のAnimatorだけではどうしても実現できない複雑な動きをさせたい場合があります。

そこで使用できるのが以下のAPI。日本語に訳すと振り付け師。

android.view.Choreographer

VSync周期でコールバックしてくれるので、それを受けて自らViewのpropertyを操作すれば好きなようにアニメーションが実装できます。


----------
最後に確認したOSバージョンはAndroid 7.0です

AndroidはGoogle Inc.の商標または登録商標です

2016年9月4日日曜日

ViewのLayer Typeについて

Windowに新規Viewを追加する際に指定するLayerTypeのZ-Order値は?

Activity以外でViewを表示したい場合、WindowManagerに直接addViewする必要がありますが、typeに指定するLayerTypeのLayer Level(Z-Order値)はドキュメントには記載されてません。

以下のソースを見ればわかります。

PhoneWindowManager#windowTypeToLayerLw


ちなみに以下のLAYERはAndroid 6.0よりAppOp権限が必要になったため気軽に使えなくなりました。

  • TYPE_PHONE
  • TYPE_PRIORITY_PHONE
  • TYPE_SYSTEM_ALERT
  • TYPE_SYSTEM_ERROR
  • TYPE_SYSTEM_OVERLAY
使用するには「他のアプリの上に表示」という設定から権限を与える必要あります。

----------
最後に確認したOSバージョンはAndroid 7.0です

AndroidはGoogle Inc.の商標または登録商標です