android实现余额宝收益播报中数字显示动态效果
16lz
2022-01-23
https://github.com/sd6352051/RiseNumber
package com.gitonway.lee.risenumber.lib;import android.content.Context;import android.util.AttributeSet;import android.widget.TextView;import com.nineoldandroids.animation.ValueAnimator;import java.text.DecimalFormat;/** * Created by lee on 2014/7/29. */public class RiseNumberTextView extends TextView implements RiseNumberBase { private static final int STOPPED = 0; private static final int RUNNING = 1; private int mPlayingState = STOPPED; private float number; private float fromNumber; private long duration = 1500; /** * 1.int 2.float */ private int numberType = 2; private DecimalFormat fnum; private EndListener mEndListener = null; final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE}; public RiseNumberTextView(Context context) { super(context); } public RiseNumberTextView(Context context, AttributeSet attr) { super(context, attr); } public RiseNumberTextView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); } public interface EndListener { public void onEndFinish(); } public boolean isRunning() { return (mPlayingState == RUNNING); } private void runFloat() { ValueAnimator valueAnimator = ValueAnimator.ofFloat(fromNumber, number); valueAnimator.setDuration(duration); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { setText(fnum.format(Float.parseFloat(valueAnimator.getAnimatedValue().toString()))); if (valueAnimator.getAnimatedFraction() >= 1) { mPlayingState = STOPPED; if (mEndListener != null) mEndListener.onEndFinish(); } } }); valueAnimator.start(); } private void runInt() { ValueAnimator valueAnimator = ValueAnimator.ofInt((int) fromNumber, (int) number); valueAnimator.setDuration(duration); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { setText(valueAnimator.getAnimatedValue().toString()); if (valueAnimator.getAnimatedFraction() >= 1) { mPlayingState = STOPPED; if (mEndListener != null) mEndListener.onEndFinish(); } } }); valueAnimator.start(); } static int sizeOfInt(int x) { for (int i = 0; ; i++) if (x <= sizeTable[i]) return i + 1; } @Override protected void onFinishInflate() { super.onFinishInflate(); fnum = new DecimalFormat("##0.00"); } @Override public void start() { if (!isRunning()) { mPlayingState = RUNNING; if (numberType == 1) runInt(); else runFloat(); } } @Override public RiseNumberTextView withNumber(float number) { this.number = number; numberType = 2; if (number > 1000) { fromNumber = number - (float) Math.pow(10, sizeOfInt((int) number) - 2); } else { fromNumber = number / 2; } return this; } @Override public RiseNumberTextView withNumber(int number) { this.number = number; numberType = 1; if (number > 1000) { fromNumber = number - (float) Math.pow(10, sizeOfInt((int) number) - 2); } else { fromNumber = number / 2; } return this; } @Override public RiseNumberTextView setDuration(long duration) { this.duration = duration; return this; } @Override public void setOnEnd(EndListener callback) { mEndListener = callback; }}
package com.gitonway.lee.risenumber.lib;/** * Created by lee on 2014/7/29. */public interface RiseNumberBase { public void start(); public RiseNumberTextView withNumber(float number); public RiseNumberTextView withNumber(int number); public RiseNumberTextView setDuration(long duration); public void setOnEnd(RiseNumberTextView.EndListener callback);}
risenumberview.withNumber(int/float).setDuration(1500).start();
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer