/*** Created by dingchao on 2018/3/27.*/
public class DcTextViewRunNumber extendsTextView {/*** 延迟*/
private final int DELAY = 20;/*** 保留小数位数 默认2为*/
private final int DECIMALS_COUNT = 2;private final int START_RUN = 101;private final int STOP_RUN = 102;/*** 跑的次数*/
private final int RUN_COUNT = 40;private floatspeed;private floatstartNum;private floatendNum;/*** 保留小数位数*/
private int decimals =DECIMALS_COUNT;/*** 每次跑的次数*/
private int runCount =RUN_COUNT;/*** 动画延迟*/
private int delayMillis =DELAY;private booleanisAniming;private Handler mHandler = newHandler() {public voidhandleMessage(Message msg) {if (msg.what ==START_RUN) {if(speed==0){if(endNum!=0){
speed=getSpeed();
startNum=speed;
}else{return;
}
}
isAniming= !running();if(isAniming) {
sendEmptyMessageDelayed(START_RUN, delayMillis);
}else{
speed= 0;
startNum= 0;
}
}
};
};publicDcTextViewRunNumber(Context context) {super(context);
}publicDcTextViewRunNumber(Context context, AttributeSet attrs) {super(context, attrs);
}public DcTextViewRunNumber(Context context, AttributeSet attrs, intdefStyleAttr) {super(context, attrs, defStyleAttr);
}/*** 开始数字跳动动画
*@return动画是否结束*/
private booleanrunning() {
setText(withDEC(String.valueOf(startNum))+ "");
startNum+=speed;if(startNum >=endNum){
setText(withDEC(String.valueOf(endNum))+ "");return true;
}return false;
}/*** 计算速度
*@return
*/
private floatgetSpeed(){float speedFloat = withDEC(String.valueOf(endNum/runCount)).floatValue();returnspeedFloat;
}/*** 判断是否是非负数
*@return
*/
private booleanisNumber(String num){if("".equals(num) || num==null)return false;
Pattern pattern= Pattern.compile("^\\d+$|\\d+\\.\\d+$");
Matcher matcher=pattern.matcher(num);returnmatcher.find();
}/*** 取整四舍五入 保留小数
*@paramnum
*@return
*/
privateBigDecimal withDEC(String num){return newBigDecimal(num).setScale(decimals, BigDecimal.ROUND_HALF_UP);
}/*** 设置显示的数字
*@paramnum*/
public voidsetShowNum(String num){
setShowNum(num,DECIMALS_COUNT);
}/*** 设置显示的数字
*@paramnum
*@paramdecimals 要保留的小数位*/
public void setShowNum(String num,intdecimals){if(!isNumber(num)){return;
}
setText(num);
setDecimals(decimals);
}/*** 开始跑*/
public voidstartRun(){if(isAniming){return;
}if(isNumber(getText().toString())){
endNum=withDEC(getText().toString()).floatValue();
mHandler.sendEmptyMessage(START_RUN);
}
}public intgetDecimals() {returndecimals;
}/*** 设置保留的小数位 0:不保留小数
*@paramdecimals*/
public void setDecimals(intdecimals) {if(decimals>=0){this.decimals =decimals;
}
setText(withDEC(getText().toString())+"");
}public intgetRunCount() {returnrunCount;
}/*** 设置动画跑的次数
*@paramrunCount*/
public void setRunCount(intrunCount) {if(runCount<=0){return;
}this.runCount =runCount;
}public intgetDelayMillis() {returndelayMillis;
}/*** 设置动画延迟
*@paramdelayMillis*/
public void setDelayMillis(intdelayMillis) {this.delayMillis =delayMillis;
}