注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


艦これの合間に書いてる

Honeycomb(API11)で強化されたアニメーションAPI

Honeycombは色々と黒歴史化されておりますが、このとき追加された概念はICS,JellyBean,そしてKitKatにも受け継がれております。その最たる例がActionBarですが、アニメーション関連APIが強化されたことも重要な着眼点でございます。

僕は個人的にViewPropertyAnimatorを乱用する傾向があるのですが、チェーンメソッドとして色々指定すればアニメーションしてくれる気軽さが良い感じです。

// Androidの公式実装としてはこういう感じに書く。
Button myButton = (Button)findViewById(R.id.button1);
myButton.animate().xBy(20).yBy(30).start();

問題:古い環境との互換性

ViewPropertyAnimatorに限らず、新しいAPIを使うには常に古い環境を意識する必要があります。特に、SupportPackageで提供されていないAPIをどうしても使いたい場合は、互換性を保ってくれるパッケージを導入したり、minSDKVersionの値を大きくしたりする対応を検討したり。でも未だにGingerBreadがAndroidシェアの4分の1を持っているという話もありますよね。。。 世界中で使われているAndroidのバージョン別シェア(2013年10月)、ついにJelly Beanのシェアが50%を上回る | juggly.cn

解決策:NineOldAndroids

アニメーション関連のAPIの後方互換を保つには、NineOldAndroisを使うのがベストだと思います。(とはいえLayoutTransitionは含まれていないらしいですが。)

公式サイトに書かれているように書くことで、ViewPropertyAnimatorが使えます。

// import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
animate(myButton).setDuration(2000).rotationYBy(720).x(100).y(100);

// 個人的にはStatic Importせずに以下のように使ってます。
// このとき、com.nineoldandroidsのクラスを参照すること
ViewPropertyAnimator.animate(myButton).setDuration(2000).rotationYBy(720).x(100).y(100);

ただ、これちょっと問題があって、View#setPivotX() のような初期値指定のAPIについては上記のやり方では設定できないのです。特にsetPivot系のオプションはアニメーション命令ではなくて初期値として設定するのが筋なので、これが設定できないとちょっと困るわけです。

myButton.setPivotX(20); // minSDK低すぎるよと怒られる

せっかく後方互換ライブラリ入れているのに、これではちょっと使い物になりませんね!でも大丈夫!

解決:ViewHelper#setPivotX(View,Long)を使う

色々と(主にStackOverflowを)調べたところ、以下のヘルパークラスを使うと良い。

ViewHelper.setPivotX(myButton, 20);

setPivotX,Yに限らず、アニメーションで使う感じのViewクラスに実装されているアレコレはViewHelperから操作することが出来ます。

そんなわけで皆様も素敵なアニメーションをAndroidでやっちゃって下さい。