NineOldAndroidsとは
Honeycombから追加された新アニメーションAPIをGingerbread以前でも使えるようにするライブラリ。
公式
NineOldAndroids
http://nineoldandroids.com/
GitHub
JakeWharton/NineOldAndroids
https://github.com/JakeWharton/NineOldAndroids
導入
ZIPダウンロード or git clone等でLibraryプロジェクトを取得して、Eclipseにimportする。
プロジェクトのLibrary参照設定を行う。
使い方
※ViewPropertyAnimatorしかいじってないので、ViewPropertyAnimatorのみ
下記のimport文を追加する。
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
公式APIはviewのanimate()メソッドを使いますが、NineOldAndroidsではstaticメソッドのanimate(View view)を使います。
// 公式API view.animate().setDuration(500).x(100).alpha(0); // NineOldAndroids animate(view).setDuration(500).x(100).alpha(0);
因みに、こんな感じにアニメーション完了後に元に戻すため更にanimate()を呼ぶと、4.1の端末でonAnimationEnd()の無限ループが発生してハマりました。。
Listenerが登録されてる状態でanime()呼ぶので当然といえば当然の挙動ですが2.3では起きないので気付くまでにだいぶ時間を費やしました...
(この動作は公式のViewPropertyAnimator APIに切り替えても同じでしたので、Honeycomb以降で下記のコードを動かすと発生するはずです。)
animate(view).x(100).setListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) {} @Override public void onAnimationRepeat(Animator animation) {} @Override public void onAnimationEnd(Animator animation) { Log.e(TAG, "onAnimationEnd()"); animate(view).x(0); } @Override public void onAnimationCancel(Animator animation) {} });Jelly Bean以降ですと
withEndAction(Runnable runnable)でアニメーション完了後の動作を指定できますが、NineOldAndroidsではこのメソッドは使えませんので
@Override public void onAnimationEnd(Animator animation) { Log.e(TAG, "onAnimationEnd()"); animate(view).x(0).setListener(null); }setListener(null)として対処しました。
その他
[Java] - [Editor] - [Content Assist] - [Favorites]の[New Type...]から
com.nineoldandroids.view.ViewPropertyAnimator
を追加するとNineOldAndroidsのanimate()メソッドに対してコード補完が効きます。
まとめ
Gingerbreadのシェアが過半数を切った今日この頃。
NineOldAndroidsで新アニメーションAPIの使い方を押さえて4.x時代に備えつつ、2.x対応もやっていこうと思っています。
大変参考になりました。
返信削除一点、当方の環境では動かない部分がありました。
厳密には下記のようです。
×animate(view).x(0).setListener(null);
○animate(view).setListener(null).x(0);
リスナを切ってからアニメーションするということで。