NumberAnimTextView
来源:互联网 发布:c语言流程图怎么画 编辑:程序博客网 时间:2024/06/08 12:11
开始的数字是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
0 0