Android效果之手机支付宝中增长的数字效果

本案例是使用开源组件RiseNumberTextView来实现类似手机支付宝中增长的数字效果,首先我们来看一下开源组件中的两个类分别如下:

[java]  view plain  copy
  1. package com.bear.risenumbertest.lib;  
  2. publicinterface RiseNumberBase {  
  3. publicvoid start();  
  4. public RiseNumberTextView withNumber(float number);  
  5. public RiseNumberTextView withNumber(int number);  
  6. public RiseNumberTextView setDuration(long duration);  
  7. publicvoid setOnEnd(RiseNumberTextView.EndListener callback);  
  8. }  

另一个类:

[java]  view plain  copy
  1. package com.bear.risenumbertest.lib;  
  2. import android.content.Context;  
  3. import android.util.AttributeSet;  
  4. import android.widget.TextView;  
  5. import com.nineoldandroids.animation.ValueAnimator;  
  6. import java.text.DecimalFormat;  
  7. publicclass RiseNumberTextView extends TextView implements RiseNumberBase{  
  8. privatestaticfinalint STOPPED = 0;  
  9. privatestaticfinalint RUNNING = 1;  
  10. privateint mPlayingState = STOPPED;  
  11. privatefloat number;  
  12. privatefloat fromNumber;  
  13. privatelong duration=1500;  
  14. /**
  15.      * 1.int 2.float
  16.      */
  17. privateint numberType=2;  
  18. private DecimalFormat   fnum;  
  19. private EndListener mEndListener=null;  
  20. finalstaticint[] sizeTable = { 9999999999999999999999999999,  
  21. 99999999999999999, Integer.MAX_VALUE };  
  22. public RiseNumberTextView(Context context){  
  23. super(context);  
  24.     }  
  25. public RiseNumberTextView(Context context,AttributeSet attr){  
  26. super(context,attr);  
  27.     }  
  28. public RiseNumberTextView(Context context,AttributeSet attr,int defStyle)  
  29.     {  
  30. super(context,attr,defStyle);  
  31.     }  
  32. publicinterface EndListener {  
  33. publicvoid onEndFinish();  
  34.     }  
  35. publicboolean isRunning() {  
  36. return (mPlayingState == RUNNING);  
  37.     }  
  38. privatevoid runFloat(){  
  39.         ValueAnimator valueAnimator = ValueAnimator.ofFloat(fromNumber, number);  
  40.         valueAnimator.setDuration(duration);  
  41.         valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
  42. @Override
  43. publicvoid onAnimationUpdate(ValueAnimator valueAnimator) {  
  44.                 setText(fnum.format(Float.parseFloat(valueAnimator.getAnimatedValue().toString())));  
  45. if (valueAnimator.getAnimatedFraction()>=1){  
  46.                     mPlayingState = STOPPED;  
  47. if (mEndListener!=null)  
  48.                     mEndListener.onEndFinish();  
  49.                 }  
  50.             }  
  51.         });  
  52.         valueAnimator.start();  
  53.     }  
  54. privatevoid runInt(){  
  55.         ValueAnimator valueAnimator = ValueAnimator.ofInt((int)fromNumber, (int)number);  
  56.         valueAnimator.setDuration(duration);  
  57.         valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
  58. @Override
  59. publicvoid onAnimationUpdate(ValueAnimator valueAnimator) {  
  60.                 setText(valueAnimator.getAnimatedValue().toString());  
  61. if (valueAnimator.getAnimatedFraction()>=1){  
  62.                     mPlayingState = STOPPED;  
  63. if (mEndListener!=null)  
  64.                     mEndListener.onEndFinish();  
  65.                 }  
  66.             }  
  67.         });  
  68.         valueAnimator.start();  
  69.     }  
  70. staticint sizeOfInt(int x) {  
  71. for (int i = 0;; i++)  
  72. if (x <= sizeTable[i])  
  73. return i + 1;  
  74.     }  
  75. @Override
  76. protectedvoid onFinishInflate() {  
  77. super.onFinishInflate();  
  78.         fnum=   new DecimalFormat("##0.00");  
  79.     }  
  80. @Override
  81. publicvoid start() {  
  82. if (!isRunning()) {  
  83.             mPlayingState = RUNNING;  
  84. if (numberType==1)  
  85.                 runInt();  
  86. else
  87.                 runFloat();  
  88.         }  
  89.     }  
  90. @Override
  91. public RiseNumberTextView withNumber(float number) {  
  92. this.number=number;  
  93.         numberType=2;  
  94. if (number>1000){  
  95.             fromNumber=number-(float)Math.pow(10,sizeOfInt((int)number)-2);  
  96.         }else {  
  97.             fromNumber=number/2;  
  98.         }  
  99. returnthis;  
  100.     }  
  101. @Override
  102. public RiseNumberTextView withNumber(int number) {  
  103. this.number=number;  
  104.         numberType=1;  
  105. if (number>1000){  
  106.             fromNumber=number-(float)Math.pow(10,sizeOfInt((int)number)-2);  
  107.         }else {  
  108.             fromNumber=number/2;  
  109.         }  
  110. returnthis;  
  111.     }  
  112. @Override
  113. public RiseNumberTextView setDuration(long duration) {  
  114. this.duration=duration;  
  115. returnthis;  
  116.     }  
  117. @Override
  118. publicvoid setOnEnd(EndListener callback) {  
  119.         mEndListener=callback;  
  120.     }  
  121. }  

将这两个类集成到我们的工程中后,就可以使用了,下面这个是使用范例:

[java]  view plain  copy  在CODE上查看代码片 
  1. package com.bear.risenumbertest;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.Menu;  
  5. import android.widget.Toast;  
  6. import com.bear.risenumbertest.lib.RiseNumberTextView;  
  7. import com.bear.risenumbertest.lib.RiseNumberTextView.EndListener;  
  8. publicclass MainActivity extends Activity {  
  9. @Override
  10. protectedvoid onCreate(Bundle savedInstanceState) {  
  11. super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13. //获取到RiseNumberTextView对象
  14.         RiseNumberTextView rnTextView = (RiseNumberTextView) findViewById(R.id.risenumber_textview);  
  15. // 设置数据
  16.         rnTextView.withNumber(2666.50f);  
  17. // 设置动画播放时间
  18.         rnTextView.setDuration(5000);  
  19. // 开始播放动画
  20.         rnTextView.start();  
  21. // 监听动画播放结束
  22.         rnTextView.setOnEnd(new EndListener() {  
  23. @Override
  24. publicvoid onEndFinish() {  
  25.                 Toast.makeText(MainActivity.this"数据增长完毕...",  
  26.                         Toast.LENGTH_SHORT).show();  
  27.             }  
  28.         });  
  29.     }  
  30. @Override
  31. publicboolean onCreateOptionsMenu(Menu menu) {  
  32. // Inflate the menu; this adds items to the action bar if it is present.
  33.         getMenuInflater().inflate(R.menu.main, menu);  
  34. returntrue;  
  35.     }  
  36. }  

附上效果图:

Android效果之手机支付宝中增长的数字效果_第1张图片


最后附上完整的工程源码链接:

android之增长的数字动画


良心的公众号,更多精品文章,不要忘记关注哈

《Android和Java技术栈》


你可能感兴趣的:(Android技术文档)