[Android]类似淘宝的数字自增自减文本

手机的支付宝每次打开都有一个数字从0到特定数字的增加或减少, 表示数值的更新. Android也提供了CountDownTimer去实现类似的效果. 要自己来实现, 原理也并不复杂,主要用Handler去定时刷新数字, 和CountDownTimer类似. 于是结合Handler和TextView即可实现. 


效果图, GIF图看起来不连贯. 运行代码效果会好一些.



例子不复杂, 所以直接上代码了,提供了自增自减, 继续自增或继续自减, 和取消的接口方法.

public class DecalAddTextView extends TextView{
	private String TAG = "DecalAddTextView";
	
	private DecimalFormat format = new DecimalFormat("0.000");
	//真实值
	private double realNum;
	//自增或自减量
	private double variable;
	//TextView显示的值
	private double tvValue;
	private boolean ifCancel = false;
	
	private int decalOpType = 0;
	private static int PLUS = 1;
	private static int MINUS = 2;
	private static int FINISHED = 3;
	
	
	private Handler mHandler = new Handler()
	{
		@Override
		public void handleMessage(Message msg)
		{
			if(msg.what == PLUS)
			{
				if(tvValue < realNum)
				{
					setText(format.format(tvValue));
					if(!ifCancel)
					{
						tvValue += variable;
						mHandler.sendEmptyMessageDelayed(PLUS, 30);
					}
				}
				else
				{
					decalOpType = FINISHED;
					setText(format.format(realNum));
				}
			}
			else if(msg.what == MINUS)
			{
				if(tvValue > 0)
				{
					setText(format.format(tvValue));
					if(!ifCancel)
					{
						tvValue -= variable;
						mHandler.sendEmptyMessageDelayed(MINUS, 30);
					}
				}
				else
				{
					decalOpType = FINISHED;
					setText("0.000");
				}
			}
		}
	};
	
	
	public DecalAddTextView(Context context){
		this(context, null);
	}
	
	
	public DecalAddTextView(Context context, AttributeSet attrs){
		this(context, attrs, 0);
	}
	
	
	public DecalAddTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	
	
	public void setValue(double d)
	{
		realNum = d;
	}
	
	/**
	 * 开始自增
	 */
	public void startDecalPlus()
	{
		decalOpType = PLUS;
		tvValue = 0.000;
		//控制变化
		variable = realNum / 30.000;
		mHandler.sendEmptyMessage(PLUS);
	}
	
	/**
	 * 开始自减
	 */
	public void startDecalMinus()
	{
		decalOpType = MINUS;
		tvValue = realNum;
		variable = realNum / 30.000;
		mHandler.sendEmptyMessage(MINUS);
	}
	
	public void cancel()
	{
		ifCancel = true;
	}
	
	public void continueDecalNum()
	{
		if(decalOpType == PLUS)
		{
			mHandler.sendEmptyMessage(PLUS);
		}
		else if(decalOpType == MINUS)
		{
			mHandler.sendEmptyMessage(MINUS);
		}
		else
		{
			Log.e(TAG, "tvValue may be zero that PLUS or MINUS's method can not be invoked...");
		}
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值