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

一、前言
一直都觉得支付宝的数字增长动画很有趣,今天抽空写了一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值