CounterText 动态数字增加

背景:制作一个类似于支付宝 财产金额动态增加的效果


思路一:将目标金额等分,利用Handler不断发生消息,延时修改金额。


实习方法:CounterText extends Text 在设置目标值时开始动态展示。


实现代码如下

public class CounterText extends TextView {
	//目标金额
	private double mGolValue;
	//增长过程中的当前金额
	private double mCurValue;
	//增加比例
	private double mRate;
	//增加模式
	private int rate = 1;
	//是否在刷新
	private boolean refreshing;
	//显示格式
	DecimalFormat fnum  = new DecimalFormat(",##0.00");
	
	//用于处理增加TextView的UI Handler
	private Handler handler = new Handler(){
		
		public void handleMessage(Message msg){
			switch(msg.what){
			case 0:
				if(rate*mCurValue < mGolValue){
					 setText(fnum.format(mCurValue));
					 mCurValue += mRate*rate;
					 //每延时50ms刷新一次
					 handler.sendEmptyMessageDelayed(0, 50);
				}else{
					refreshing = false;
					setText(fnum.format(mGolValue));
				}
				break;
			default:
				break;
			}
		}
	};
	
	public CounterText(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	
	public CounterText(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
	
	public CounterText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}
	
	public void StartDisplay(){
		if(refreshing)
			handler.sendEmptyMessage(0);
	}
	//输入金额和设置 mCurValue mGolValue mRate refreshing等值
	public void setValue(String amount) {
		double value = Double.parseDouble(amount.replaceAll(",", ""));
		if(value > 0.00){
			refreshing =true;
			mCurValue = 0.00;
			mGolValue = value;
			mRate = new BigDecimal((double)(value/13.00)).setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue();
			StartDisplay();
		}else if(value == 0.00){
			refreshing = false;
			setText("0.00");
		}
	}
	
	
}


注意:格式化的时候,小数点后的精确问题,否则可能会出现比较小的小数被认为0的详情。


思路二:利用ValueAnimation的UpdateListener回调来动态修改金额。


实习方法:CounterText extends Text 在设置目标值时开始动态展示。


关键代码

 private void startAnimation() {

        anim = ValueAnimator.ofFloat(0,1);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {

               	mCurValue = mGolValue * (float)animation.getAnimatedValue();
                invalidate();
            }
        });

        anim.setDuration(500);
        anim.start();
        startAnim = false;
    }


显示回调OnDraw()方法即可。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值