一、前言
一直都觉得支付宝的数字增长动画很有趣,今天抽空写了一个Demo与大家分享一下。
最终的实现效果图
不过这个Demo有几个缺点
1、最大的结束值不能超过10000000。
2、小数点的位数只能固死两位数。
不过嘛也不妨碍日常使用,打算以后再完善这些缺点吧^_^
二、使用方法
调用方法比较简单。有两个重载方法,第一个只需要传入一个结束值就行了。
如果你不仅想传入一个结束值还想指定动画的执行时间,请使用第二个start方法。
三、源代码
try {
//
customBounceTextView.start(395f);
//2000表示增长的动画持续2秒
//customBounceTextView.start(395f, 2000);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplication(), "有异常", Toast.LENGTH_SHORT).show();
}
三、源代码
package per.edward.numberrise;
import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* description:仿支付宝“数字增长动画”
* <p/>
* author:Edward
* <p/>
* 2015/11/13
*/
public class CustomBounceTextView extends TextView {
public CustomBounceTextView(Context context) {
super(context, null, 0);
}
public CustomBounceTextView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public CustomBounceTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 开始数字增长动画(声明了Exception异常,要求使用者必须处理此异常)
*
* @param endNumber
*/
public void start(float endNumber) throws Exception {
start(endNumber, 1500);
}
/**
* 开始数字增长动画(声明了Exception异常,要求使用者必须处理此异常)
*
* @param endNumber
* @param duration
*/
public void start(float endNumber, int duration) throws Exception {
if (endNumber > 10000000) {
//抛出异常
throw new IllegalArgumentException(endNumber + "不能大于10000000");
}
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, endNumber);
//动画的持续时间
valueAnimator.setDuration(duration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float temp = (float) valueAnimator.getAnimatedValue();
setText(getRiseNumber(temp));
}
});
//开始执行动画
valueAnimator.start();
}
/**
* 获取增长的数字
*
* @param number
* @return
*/
public String getRiseNumber(float number) {
String numberStr = String.valueOf(number);
//获取小数点的下标(由于下标是有0开始,为了方便计算将其加1变为从1开始)
int pointIndex = numberStr.indexOf(".") + 1;
//计算此字符串的长度
int lastNumberIndex = numberStr.length();
if (pointIndex + 1 == lastNumberIndex) {
//如果传进来的字符串例如是:123.0的则直接在后面拼接1个0
return numberStr + "0";
} else if (pointIndex + 1 == lastNumberIndex + 1) {
//如果传进来的字符串例如是:123.00小数点恰好是两位,则直接返回该字符串
return numberStr;
} else {
//如果传进来的字符串例如是:123.0000的,则直接截取第0位到小数点后两位的字符串
return numberStr.substring(0, pointIndex + 2);
}
}
}
四、结束
源代码请戳这里仿支付宝“数字增长动画”