仿支付宝“数字增长动画”

来源:互联网 发布:少女前线枪娘数据大全 编辑:程序博客网 时间:2024/05/18 00:51
一、前言
一直都觉得支付宝的数字增长动画很有趣,今天抽空写了一个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);        }    }}

四、结束

源代码请戳这里仿支付宝“数字增长动画”


0 0