[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...");
		}
	}
	
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。