全部で９つあるInterpolatorをSpinnerに追加しました。  
そこから選択されたアイテムに応じてsetInterpolatorを書くボタンを押す毎に変更できるようにしたい  
例を示すと、AnticipateInterpolatorをSpinnerで選択し移動ボタンをタップすると、通常の移動のアニメーションにAnticipateInterpolatorが追加され表示される  
のようにしたいです  
[![各エフェクト毎にInterpolatorを設定したい](https://i.stack.imgur.com/uvDxw.jpg)](https://i.stack.imgur.com/uvDxw.jpg)  
[![画像の説明をここに入力](https://i.stack.imgur.com/f5SsZ.jpg)](https://i.stack.imgur.com/f5SsZ.jpg)

今考えているのはif文でspinnerのアイテムを判断し、１つずつ

```

    if(spinnerから取得した値==OvershootInterpolator){
        trans.setInterpolator(new OvershootInterpolator());
    else if(spinnerから取得した値==AnticipateInterpolator){
        trans.setInterpolator(new AnticipateInterpolator());
    
```

書いていくことしか思いつかないのですが、そうすると数が増えてくると困難です  
いい方法がありましたら、教えてください
CC BY-SA 3.0
2015-07-28T08:39:43.830
12769
2015-10-26T14:56:20.500
8044
question
android
androidのView.animationでInterpolatorをドロップダウンリストから種類を選択できるようにしたい
`Map`に保持するのがいいと思います。

単に`Map<String,
Interpolator>`を用意すればいいのですが、それでは無駄な`Interpolator`を生成しますし、芸もないのでリフレクションを使ってみます。

特定のバージョンのSDKにしかないものやリソース定義された`Animation`については考慮していないですが、

```

    final static Map<String, Class<? extends Interpolator>> easingMap;
    static {
        Map<String, Class<? extends Interpolator>> tmpMap = new HashMap<>();
        tmpMap.put("OvershootInterpolator", android.view.animation.OvershootInterpolator.class);
        easingMap = Collections.unmodifiableMap(tmpMap);
    }
    
```

このような`Map`を定義しておき、

```

    Animation anim = null;
    try {
        anim = new TranslateAnimation(0, 10, 300, 20);
        anim.setDuration(500);
        anim.setInterpolator(easingMap.get("OvershootInterpolator").getConstructor().newInstance());
    } catch (Exception e) {
        // InstantiationException、IllegalAccessException、InvocationTargetException、
        // NoSuchMethodExceptionをハンドリングする必要がありますが、例示なのでポケモン例外処理です。
        e.printStackTrace();
    }
    
    if(anim != null) {
        imageView.startAnimation(anim);
    }
    
```

`getConstructor().newInstance()`で動的に`Interpolator`を生成するという方法が取れます。
CC BY-SA 3.0
2015-07-28T12:27:45.530
12776
2015-07-28T12:27:45.530
5337
12769
answer