开始的数字是0,然后,使用动画是数字滚动起来。监听动画的变化,然后不断刷新页面。
自定义的数字动画 TextView
package me.bakumon.numberanimtextview;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.TextView;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
/**
* 数字增加动画的 TextView
* Created by bakumon on 16-11-26.
*/
public class NumberAnimTextView extends TextView {
private String mNumStart = "0"; //
private String mNumEnd; //
private long mDuration = 2000; //
private String mPrefixString = ""; // 前缀
private String mPostfixString = ""; //后缀
public NumberAnimTextView(Context context) {
super(context);
}
public NumberAnimTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NumberAnimTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setNumberString(String number) {
setNumberString("0", number);
}
public void setNumberString(String numberStart, String numberEnd) {
mNumStart = numberStart;
mNumEnd = numberEnd;
if (checkNumString(numberStart, numberEnd)) {
// 数字合法 开始数字动画
start();
} else {
// 数字不合法 直接调用 setText 设置最终值
setText(mPrefixString + numberEnd + mPostfixString);
}
}
public void setDuration(long mDuration) {
this.mDuration = mDuration;
}
public void setPrefixString(String mPrefixString) {
this.mPrefixString = mPrefixString;
}
public void setPostfixString(String mPostfixString) {
this.mPostfixString = mPostfixString;
}
private boolean isInt; // 是否是整数
/**
* 校验数字的合法性
*
* @param numberStart 开始的数字
* @param numberEnd 结束的数字
* @return 合法性
*/
private boolean checkNumString(String numberStart, String numberEnd) {
try {
new BigInteger(numberStart);
new BigInteger(numberEnd);
isInt = true;
} catch (Exception e) {
isInt = false;
e.printStackTrace();
}
try {
BigDecimal start = new BigDecimal(numberStart);
BigDecimal end = new BigDecimal(numberEnd);
return end.compareTo(start) >= 0;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private void start() {
ValueAnimator animator = ValueAnimator.ofObject(new BigDecimalEvaluator(), new BigDecimal(mNumStart), new BigDecimal(mNumEnd));
animator.setDuration(mDuration);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
BigDecimal value = (BigDecimal) valueAnimator.getAnimatedValue();
setText(mPrefixString + format(value) + mPostfixString);
}
});
animator.start();
}
/**
* 格式化 BigDecimal ,小数部分时保留两位小数并四舍五入
*
* @param bd BigDecimal
* @return 格式化后的 String
*/
private String format(BigDecimal bd) {
String pattern;
if (isInt) {
pattern = "#,###";
} else {
pattern = "#,##0.00";
}
DecimalFormat df = new DecimalFormat(pattern);
return df.format(bd);
}
class BigDecimalEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
BigDecimal start = (BigDecimal) startValue;
BigDecimal end = (BigDecimal) endValue;
BigDecimal result = end.subtract(start);
return result.multiply(new BigDecimal("" + fraction)).add(start);
}
}
}
Activity中使用:
package io.github.bakumon.numberanimtextview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import me.bakumon.numberanimtextview.NumberAnimTextView;
public class MainActivity extends AppCompatActivity {
private NumberAnimTextView mNumberAnimTextView;
private NumberAnimTextView mNumberAnimTextView1;
private NumberAnimTextView mNumberAnimTextView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNumberAnimTextView = (NumberAnimTextView) findViewById(R.id.text);
mNumberAnimTextView1 = (NumberAnimTextView) findViewById(R.id.text1);
mNumberAnimTextView2 = (NumberAnimTextView) findViewById(R.id.text2);
}
public void start(View view) {
mNumberAnimTextView.setPrefixString("¥");
mNumberAnimTextView.setNumberString("1111.75", "98765432.75");
mNumberAnimTextView1.setNumberString("1234567");
mNumberAnimTextView2.setPostfixString("%");
mNumberAnimTextView2.setNumberString("19.75", "99.75");
}
}
转载来源于:https://github.com/Bakumon/NumberAnimTextView