2017-06-22 1 views
1

J'essaie d'animer le comportement d'incrémentation d'un nombre de zéro à un nième nombre. ValueAnimator fonctionne pour une valeur entière mais j'ai essayé de le faire avec une valeur flottante et il se bloque avec un ClassCastException.L'utilisation de la valeur Float dans ValueAnimator provoque l'exception

Exception:

java.lang.ClassCastException: java.lang.Float ne peut pas être jeté à java.lang.Integer

code:

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(); 

Quels changements dois-je faire pour que cela fonctionne pour les valeurs flottantes? Merci!

+0

Avez-vous essayé d'utiliser un FloatEvaluator au lieu d'un TypeEvaluator? https://developer.android.com/reference/android/animation/FloatEvaluator.html – khriskooper

+0

animator.setEvaluator() Utilisez Float au lieu de Integer. –

Répondre

2

Il me semble que vous abusant du ValueAnimator.

Une approche beaucoup plus facile à utiliser l'Animateur de valeur serait d'utiliser ValueAnimator.ofFloat(float... values) cela va automatiquement définir l'évaluateur pour vous. Dans votre code, vous fournissez des valeurs flottantes à un évaluateur d'entiers, provoquant votre exception de cast.

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(); 

Ce code devrait fonctionner selon votre situation. J'ai changé l'écouteur de mise à jour pour mettre le texte à quel que soit le animatedValue afin que votre ValueAnimator fasse quelque chose. Je ne vois pas l'intérêt de mettre le texte à "100.2" chaque fois que l'animateur se mettra à jour car l'utilisateur ne verrait aucun changement, bien que vous ayez probablement d'autres plans pour le UpdateListener de toute façon. Alternativement, vous pouvez corriger votre évaluateur pour évaluer Floats au lieu de nombres entiers.

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

Troncature animatedValue

Si vous souhaitez limiter la valeur croissante à seulement 1 place décimale, je vous conseille de faire ceci:

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()); 

Placez ce code dans votre auditeur onAnimationUpdate et Vous pouvez ensuite recevoir une valeur tronquée de la valeur animée à une décimale.

+0

Salut cela fonctionne mais pendant l'animation, le ValueAnimator parcourt 8 décimales avant de le terminer à 100.2. Par exemple, il traverse 0.123456 et incrémente tilll 100.2. De toute façon limiter cela à 1 point décimal? – Dinuka

+0

Oui @RickGrimesTheCoder J'ai ajouté du code à ma réponse pour répondre à votre question, j'espère que c'est ce que vous cherchiez! –

+0

Merci Alex! J'apprécie le soutien – Dinuka

1

Essayez celui-ci peut-être cela vous aider. Ça marche pour moi. Essayez de remplacer TypeEvaluator avec TypeEvaluator

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