TypeEvaluator を使った簡単な ValueAnimator

TypeEvaluatorがかなり便利だったのでソレについて

TypeEvaluatorとは

TypeEvaluator | Android Developers
コレです。

簡単に書くと...

ValueAnimator.ofFloat(0.f,1.f);

にしたValueAnimatorはセットしたDurationの間に0.fから1.fまでの値を受け取ることが出来ますね。
例えば上の状態だとsetDuration(1000)の場合、10msの時getAnimatorValuesで0.01fが取得できるみたいな(Interpolatorがy=xな時)
コレが、単一の数字同士なら楽なんですが、例えば

float[][] hoge

な多次元配列のものを引数に渡し、いい感じに値を受け取りたいという時にTypeEvaluatorが活躍します。
例えば

float[][] hoge = {{0,0},{10,10},{100,100}};
float[][] hoge2 = {{0,0},{100,100},{0,0}};

で1000msの間にhogeからhoge2に値を移動したいValueAnimatorの場合、提供されているValueAnimator.of~ では対応できません。
(500msの時に{{0,0},{55,55},{50,50}}な値を取得したい)
ので、TypeEvaluatorをそこの中身の処理を書くといった感じになっています。

とりあえず、使い方とかコード見れば即わかりすると思うのでサンプルをどうぞ。

gist.github.com

で、TypeEvaluatorがここの部分

public static class WaveTypeEvaluator implements TypeEvaluator<float[][]> {

        @Override
        public float[][] evaluate(float v, float[][] start, float[][] end) {
            float[][] newValue = new float[start.length][start[0].length];

            for (int i = 0; i < start.length; i++) {
                for (int j = 0; j < start[i].length; j++) {
                    newValue[i][j] = start[i][j] + (end[i][j] - start[i][j]) * v;
                }
            }
            return newValue;
        }
}

forの中にlengthを使うなとか言うツッコミは置いておいて。
結論書くと、自分で時間に対する値を設定できるという感じです。
オレオレTypeEvaluatorだったら基本的に何でも捌けて非常に良いですね!!!!!

例えば、今回は多次元配列を例にしていますが、作ったModelClassを引数に渡して

public static class WaveTypeEvaluator implements TypeEvaluator<MyPoint> {

        @Override
        public MyPoint evaluate(float v, MyPoint start, MyPoint end) {
            MyPoint newPoint = new MyPoint();
            newPoint.setX(start.getX() + (end.getX() - start.getX()) * v);
            return newPaint;
        }
}

こんな感じにイケるんですね。
便利。

ついでにこのViewはこんな感じ
http://i.gyazo.com/55e57471e4fc912b93b65ac79ad4d01b.gif

はー素晴らしきTypeEvaluator。
また、ValueAnimatorと少しだけ仲良く慣れました。

最後に

TypeEvaluator、多次元配列だけじゃなくて、ここイジれば「インターポレイラー」も実はこの中に組むことが出来たりと、普通に便利でした。
もっと、Viewのカスタマイズしていって知見をためたい。
あと、内定欲しい。

ではではー