2013年3月7日木曜日

NineOldAndroidsを使ってみた

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対応もやっていこうと思っています。

1 件のコメント:

  1. 大変参考になりました。

    一点、当方の環境では動かない部分がありました。
    厳密には下記のようです。
    ×animate(view).x(0).setListener(null);
    ○animate(view).setListener(null).x(0);

    リスナを切ってからアニメーションするということで。

    返信削除