2012年7月30日月曜日

TimeInterpolatorを使ってかんたんEasing。

Easingというのはスクロール時の変化量にアクセントを付ける関数のことで、これがあるのとないのとではUIの気持ちよさが全然変わる。

iOSと比べると、androidは組み込みのEasing関数が充実しているんだけど、あまり有効活用されているイメージがない。

----

Easing関数を扱うインターフェースであるInterpolatorは、基本的にアニメーションフレームワークの一部であって、自作View内の動きにちょっとEasingを効かせたい、というような用途には使えなかった。

しかしandroid3系からは、TimeInterpolatorにgetInterpolationというpublicメソッドが加わった。これは現在の経過時間を0~1.0fで入力すると、Easingによる補完結果を0~1.0f(Overshootなど1.0fを超える値が返ることもある)で返してくれるという超お手軽メソッドである。

private final TimeInterpolator interpolator = new DecelerateInterpolator();
private int alpha 255;
//ScheduledExecutorServiceでの定期処理を想定
@Override
public void run() {  
 alpha -= 4;
 size = 120 * interpolator.getInterpolation(1.0f - alpha/255.0f);

 if(alpha < 0){
  alpha = 255;
 }
 //ハンドラでview#invalidateを呼んでる。
 handler.sendEmptyMessage(0);
}

テキトウなコードだけど、これでEasingできてしまう。動きが気に入らなければInterpolatorを適当なのに変えるだけでいい。複雑なアニメーションロジックは隠蔽され、再利用によってお手軽に気持ちいい動作を実現できる。すばらしい。

しかし3以降限定なので、まだまだ主流の2系をハブることになってしまう。

----

android2系にはgetInterpolation()がないのか?っていうと実はそんなことはなくて、実はInterpolatorインターフェースで宣言されていました。

PropertyAnimationの導入と共にアニメーションフレームワークが書き換えられて、getInterpolation()はInterpolatorからTimeInterpolatorへ、代わりにInterpolatorがTimeInterpolatorを継承することで、今までのコードも互換性を保つように変更されました。

ですので、newした実装クラスをInterpolatorでキャストして、Interpolatorインターフェース経由で操作すれば、android2系でも動くはずです。たぶん。

----

Scroller(フリック時のスクロール量をエミュレーション)とか、Interpolatorみたいなのはフレームワーク内部のクラスだからほとんど話題にされてるのを見ないけど、実は外部からも普通に使えて、意外と便利だったりする。

0 件のコメント:

コメントを投稿