Android之增长的数字动画

本案例是使用开源组件RiseNumberTextView来实现类似手机支付宝中增长的数字效果,首先我们来看一下开源组件中的两个类分别如下:

package com.bear.risenumbertest.lib;

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);
}

另一个类:

package com.bear.risenumbertest.lib;

import Android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

import com.nineoldandroids.animation.ValueAnimator;

import java.text.DecimalFormat;

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() {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b1dbd8dd327b830f62859ed8ad6b7561.html