TextView 数字自动增长

来源:互联网 发布:java面向对象的特点 编辑:程序博客网 时间:2024/05/17 09:36

就是一个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搞定,具体细节直接看代码

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 塑料眼镜腿断了怎么办 眼镜上的螺丝拧不紧怎么办 眼镜的把坏了怎么办 把眼镜坐坏了怎么办 梦见眼镜腿掉了怎么办 眼镜的腿掉了怎么办 眼镜腿的螺丝掉了怎么办 爱大爱眼镜掉腿了怎么办 合金眼镜腿断了怎么办 手关节复位h疼痛怎么办 我叫mt红色卡牌怎么办 星盟冲突qq登录怎么办 汽车雷达下雨一直响怎么办 火山小视频封火力怎么办 电脑被当成矿机怎么办 哥华有线机顶盒反应慢怎么办 电脑绣花机编码器坏了怎么办? 伺服电机开起没有力怎么办 西门子冰箱排水孔堵塞怎么办 数控车床西门子系统卡顿怎么办 手机系统不支持多屏互动怎么办 伺服驱动器系统错误报警怎么办 防雷接地电阻不符合规范怎么办 微信支付风控了怎么办 伺服电机没有配原点开关怎么办 电脑自带游戏打不开怎么办 战地1更新很慢怎么办 客户端提示初始化控件失败怎么办 刺客信条兄弟会存档损坏怎么办 百度不小心点赞怎么办 c盘空间不够了怎么办 百度云打开压缩文件失败怎么办 电脑只有一个c盘怎么办 u盘文件删不了怎么办 在电脑上照片打不开乱码怎么办 win7电脑登录密码忘记了怎么办 三洋电视应用商店打不开怎么办 中兴手机应用商店打不开怎么办 绝地求生与服务器失去连接怎么办 战地4载入不进去怎么办 电脑软件无法找到入口怎么办