TextView 数字自动增长

就是一个TextView每个数子,不停的改变数值的书,在目标值停下来—直接上图(原谅我不会上传gif)
第一张(注意看标注)
这里写图片描述
第二张(注意看标注)
这里写图片描述
第三张(注意看标注,这里声明的textview是一个自定义的o)
这里写图片描述

我想大致的动画想过,你们可以想想的出来,具体的实现我就不说了(代码有详细注释),直接应用我的代码,你就可以直接使用

第一步:写一个接口

package com.lzyc.ybtappcal.widget;

/**
 * 增长的数字接口
 * 
 */
public interface IRiseNumber {
    /**
     *  开始播放动画的方法
     */
    public void start();

    /**
     * 设置小数
     * 
     * @param number
     * @return
     */
    public void withNumber(float number);

    /**
     * 设置整数
     * 
     * @param number
     * @return
     */
    public void withNumber(int number);

    /**
     * 设置动画播放时长
     * 
     * @param duration
     * @return
     */
    public void setDuration(long duration);

    /**
     * 设置动画结束监听器
     * 
     * @param callback
     */
    public void setOnEndListener(RiseNumberTextView.EndListener callback);
}

第二步:自定义TextView(继承textview,并且实现我们刚刚写的接口)

package com.lzyc.ybtappcal.widget;

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

import com.lzyc.ybtappcal.R;
import com.nineoldandroids.animation.ValueAnimator;

import java.text.DecimalFormat;


public class RiseNumberTextView extends TextView implements IRiseNumber {

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

    /**
     * 使用xml布局文件默认的被调用的构造方法
     *
     * @param context
     * @param attr
     */
    public RiseNumberTextView(Context context, AttributeSet attr) {
        super(context, attr);
        setTextColor(context.getResources().getColor(R.color.rise_number_text_color_white));
        setTextSize(12);
    }

    public RiseNumberTextView(Context context, AttributeSet attr, int defStyle) {
        super(context, attr, defStyle);
    }

    /**
     * 判断动画是否正在播放
     *
     * @return
     */
    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 void withNumber(float number) {

        this.number = number;
        numberType = 2;
        if (number > 1000) {
            fromNumber = number
                    - (float) Math.pow(10, sizeOfInt((int) number) - 1);
        } else {
            fromNumber = number / 2;
        }

    }

    /**
     * 设置一个整数进来
     */
    @Override
    public void 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;
        }

    }

    /**
     * 设器置动画时长
     */
    @Override
    public void setDuration(long duration) {
        this.duration = duration;
    }

    /**
     * 设器置动画结束监听
     */
    @Override
    public void setOnEndListener(EndListener callback) {
        mEndListener = callback;
    }

    /**
     * 定义动画结束接口
     */
    public interface EndListener {
        /**
         * 当动画播放结束时的回调方法
         */
        public void onEndFinish();
    }

}

第三步:需要显示的xml中应用自定义textview

                <com.lzyc.ybtappcal.widget.RiseNumberTextView
                    android:id="@+id/id_drugs_detail_shequ_paymyself"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="0.00"
                    android:textColor="@color/color_ffffff"
                    android:textSize="@dimen/text_font_13" />

第四部:代码执行开始动画

 /**
     * 数字自动增长
     *
     * @param number    数值的目标数(最后的值)
     * @param view      自定义的RiseNumberTextView
     */
    private void startNumberAutoUp(RiseNumberTextView view, String number) {
        view.withNumber(Float.parseFloat(number));
        // 设置动画播放时间
        view.setDuration(1500);
        // 开始播放动画
        view.start();
    }

最后:OK搞定,具体细节直接看代码

猜你喜欢

转载自blog.csdn.net/tongzhengtong/article/details/52198443