CounterText 动态数字增加

来源:互联网 发布:kof98um下载 mac 编辑:程序博客网 时间:2024/06/05 06:42

背景:制作一个类似于支付宝 财产金额动态增加的效果


思路一:将目标金额等分,利用Handler不断发生消息,延时修改金额。


实习方法:CounterText extends Text 在设置目标值时开始动态展示。


实现代码如下

public class CounterText extends TextView {//目标金额private double mGolValue;//增长过程中的当前金额private double mCurValue;//增加比例private double mRate;//增加模式private int rate = 1;//是否在刷新private boolean refreshing;//显示格式DecimalFormat fnum  = new DecimalFormat(",##0.00");//用于处理增加TextView的UI Handlerprivate Handler handler = new Handler(){public void handleMessage(Message msg){switch(msg.what){case 0:if(rate*mCurValue < mGolValue){ setText(fnum.format(mCurValue)); mCurValue += mRate*rate; //每延时50ms刷新一次 handler.sendEmptyMessageDelayed(0, 50);}else{refreshing = false;setText(fnum.format(mGolValue));}break;default:break;}}};public CounterText(Context context) {super(context);// TODO Auto-generated constructor stub}public CounterText(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public CounterText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public void StartDisplay(){if(refreshing)handler.sendEmptyMessage(0);}//输入金额和设置 mCurValue mGolValue mRate refreshing等值public void setValue(String amount) {double value = Double.parseDouble(amount.replaceAll(",", ""));if(value > 0.00){refreshing =true;mCurValue = 0.00;mGolValue = value;mRate = new BigDecimal((double)(value/13.00)).setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue();StartDisplay();}else if(value == 0.00){refreshing = false;setText("0.00");}}}


注意:格式化的时候,小数点后的精确问题,否则可能会出现比较小的小数被认为0的详情。


思路二:利用ValueAnimation的UpdateListener回调来动态修改金额。


实习方法:CounterText extends Text 在设置目标值时开始动态展示。


关键代码

 private void startAnimation() {        anim = ValueAnimator.ofFloat(0,1);        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {               mCurValue = mGolValue * (float)animation.getAnimatedValue();                invalidate();            }        });        anim.setDuration(500);        anim.start();        startAnim = false;    }


显示回调OnDraw()方法即可。




1 0
原创粉丝点击