2017-06-22 3 views
1

ゼロからn番目の数値まで増加する動作をアニメートしようとしています。 ValueAnimatorは整数値で動作しますが、浮動小数点値でこれを試みて、ClassCastExceptionでクラッシュします。ValueAnimatorで浮動小数点値を使用すると例外が発生します

例外:

とjava.lang.ClassCastException:java.lang.Floatのはjava.lang.Integerの

にキャストすることはできません

コード:

ValueAnimator animator = new ValueAnimator(); 
animator.setObjectValues(0, 100.2f); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       public void onAnimationUpdate(ValueAnimator animation) { 
        tvTotalAmount.setText("100.2"); 
       } 
      }); 
animator.setEvaluator(new TypeEvaluator<Integer>() { 
       public Integer evaluate(float fraction, Integer startValue, Integer endValue) { 
        return Math.round(startValue + (endValue - startValue) * fraction); 
       } 
      }); 
animator.setDuration(1500); 
animator.start(); 

浮動小数点値に対してこの機能を実行するには、どのような変更が必要ですか?ありがとう!

+0

TypeEvaluatorではなくFloatEvaluatorを使用してみましたか? – khriskooper

+0

animator.setEvaluator()整数の代わりに浮動小数点数を使用します。 –

答えて

2

でTypeEvaluatorを交換してください。

バリューアニメーターを使用する方がはるかに簡単ですValueAnimator.ofFloat(float... values)を使用すると、自動的にエバリュエーターが設定されます。あなたのコードでは、浮動小数点値を整数評価子に供給しているので、キャスト例外が発生します。

ValueAnimator animator = ValueAnimator.ofFloat(0f, 100.2f); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      public void onAnimationUpdate(ValueAnimator animation) { 
       tvTotalAmount.setText(String.valueOf((float)animation.getAnimatedValue())); 
      } 
     }); 
animator.setDuration(1500); 
animator.start(); 

このコードは、状況に応じて動作するはずです。私はValueAnimatorが実際に何かをするようにanimatedValueが何であってもテキストを設定するように更新リスナーを変更しました。私はアニメーターが更新されるたびにテキストを "100.2"に設定することには何の変化も見られませんが、おそらくあなたはUpdateListenerのための他の計画を持っていたと思います。

また、整数の代わりに浮動小数点数を評価するようにEvaluatorを修正することもできます。

animatedValue

を切捨て

animator.setEvaluator(new TypeEvaluator<Float>() { 
    @Override 
    public Float evaluate(float fraction, Float startValue, Float endValue) { 
     return (startValue + (endValue - startValue) * fraction); 
    } 
}); 

あなただけの1小数点以下の場所に増加する値を制限したい場合は、私はこれを行うことを示唆している:

DecimalFormat df = new DecimalFormat("###.#"); 
df.setRoundingMode(RoundingMode.DOWN); //DOWN if you dont want number rounded, UP if you do want it rounded 
float oneDecimal = df.format((float)animation.getAnimatedValue()); 

置き、このコードあなたのonAnimationUpdateリスナー内とアニメートされた値の切り捨てられた値を小数点以下1桁まで受け取ることができます。

+0

こんにちはこれは動作しますが、アニメーション中、ValueAnimatorは小数点以下8桁までを反復して100.2で終了します。例えば、それは0.123456を通り抜け、tilll 100.2をインクリメントする。とにかくこれを1小数点以下に制限しますか? – Dinuka

+0

はい@RickGrimesTheCoder Iveはあなたの質問に答えるために自分の答えにコードを追加しました。 –

+0

ありがとうアレックス!私はサポートに感謝します – Dinuka

1

これを試してみてください。わたしにはできる。 それはあなたがValueAnimatorを悪用している私には思えるTypeEvaluator

animator.setEvaluator(new TypeEvaluator<Float>() { 
     @Override 
     public Float evaluate(float fraction, Float startValue, Float endValue) { 
      return (startValue + (endValue - startValue) * fraction); 
     } 
    }); 
関連する問題