Android 仿余额宝数字动画效果

看过好几篇进行数字动画处理的文章,这个是我发现的最简单也是最好理解的,特地拿出来和大家分享。

核心的代码主要是重写了 TextView这个控件,做了一些自己的处理。

package com.lance.widget;

import java.text.DecimalFormat;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

/**
 * 一、设置跳跃的帧数,setFrames(int frames),默认是25帧 二、设置数字格式 , setFormat(String
 * pattern),具体查DecimalFormat类的api 三、需要动画效果用,playNumber(double
 * number)方法代替setText()方法,小数如果超过3位小数会四舍五入保留2位小数
 *
 * @author Lance
 *
 */
public class RunningTextView extends TextView {

    public double content;// 最后显示的数字
    private int frames = 25;// 总共跳跃的帧数,默认25跳
    private double nowNumber = 0.00;// 显示的时间
    private ExecutorService thread_pool;
    private Handler handler;
    private DecimalFormat formater;// 格式化时间,保留两位小数

    public RunningTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public RunningTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RunningTextView(Context context) {
        super(context);
        init();
    }

    public int getFrames() {
        return frames;
    }

    // 设置帧数
    public void setFrames(int frames) {
        this.frames = frames;
    }

    /**
     * 设置数字格式,具体查DecimalFormat类的api
     * @param pattern
     */
    public void setFormat(String pattern) {
        formater = new DecimalFormat(pattern);
    }

    // 初始化
    private void init() {

        thread_pool = Executors.newFixedThreadPool(2);// 2个线程的线程池
        formater = new DecimalFormat("00.00");// 最多两位小数,而且不够两位整数用0占位。可以通过setFormat再次设置   decimalformat用来格式化数字
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                RunningTextView.this.setText(formater.format(nowNumber)
                        .toString());// 更新显示的数字
                nowNumber += Double.parseDouble(msg.obj.toString());// 跳跃arg1那么多的数字间隔
//                Log.v("nowNumber增加之后的值", nowNumber + "");
                //
                if (nowNumber < content) {
                    Message msg2 = handler.obtainMessage();
                    msg2.obj = msg.obj;
                    handler.sendMessage(msg2);// 继续发送通知改变UI
                } else {
                    RunningTextView.this.setText(formater.format(content)
                            .toString());// 最后显示的数字,动画停止
                }
            }
        };
    }

    /**
     * 播放数字动画的方法
     *
     * @param moneyNumber
     */
    public void playNumber(double moneyNumber) {
        if (moneyNumber == 0) {
            RunningTextView.this.setText("0.00");
            return;
        }
        content = moneyNumber;// 设置最后要显示的数字
        nowNumber = 0.00;// 默认都是从0开始动画
        thread_pool.execute(new Runnable() {
            @Override
            public void run() {
                Message msg = handler.obtainMessage();
                double temp = content / frames;
                msg.obj = temp < 0.01 ? 0.01 : temp;// 如果每帧的间隔比1小,就设置为1
//                Log.v("每帧跳跃的数量:", "" + msg.obj.toString());
                handler.sendMessage(msg);// 发送通知改变UI
            }
        });
    }

}

  原理主要是利用handler进行递归 不断的累加数字

package com.lance.runningtextview;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private Button mBtrmb;
    private Button mBtdollar;
    private Button mBturo;
    private com.lance.widget.RunningTextView mRunningtextview;
    private EditText mEdit;
    private Button mBtplay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
        // 设置数字格式,具体查DecimalFormat类的api
        mRunningtextview.setFormat("00.00");
        mBtplay.setOnClickListener(this);
        mBtrmb.setOnClickListener(this);
        mBtdollar.setOnClickListener(this);
        mBturo.setOnClickListener(this);
    }

    private void bindViews() {

        mBtrmb = (Button) findViewById(R.id.btrmb);
        mBtdollar = (Button) findViewById(R.id.btdollar);
        mBturo = (Button) findViewById(R.id.bturo);
        mRunningtextview = (com.lance.widget.RunningTextView) findViewById(R.id.runningtextview);
        mEdit = (EditText) findViewById(R.id.edit);
        mBtplay = (Button) findViewById(R.id.btplay);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btplay:
            // 播放数字动画
            String temp = mEdit.getText().toString();
            Log.v("temp:", temp);
            if(!temp.equals("")){
                double number = Double.parseDouble(temp);
                mRunningtextview.playNumber(number);
            }
            break;

        case R.id.btrmb:
            Toast.makeText(this, "use the symbol ¥ ", Toast.LENGTH_SHORT).show();
            mRunningtextview.setFormat("¥00.00");
            break;
        case R.id.bturo:
            Toast.makeText(this, "use the symbol € ", Toast.LENGTH_SHORT).show();
            mRunningtextview.setFormat("€00.00");
            break;
        case R.id.btdollar:
            Toast.makeText(this, "use the symbol $ ", Toast.LENGTH_SHORT).show();
            mRunningtextview.setFormat("$00.00");
            break;
        }

    }

}
时间: 2024-10-15 20:34:55

Android 仿余额宝数字动画效果的相关文章

Android 仿余额宝数字动画实现

简介 好久没有写博客了,最近公司产品刚发布了,终于有一点休闲的时间了,趁这个空闲的时间,今天给大家写一个数字动画的效果,可能在以后的时间,或许大家会用的到,值得大家收藏,直接拿过去用就好了. 一:想都不用想的,有图有真相,看着爽了,在看下面源码 二:实例源码分析 ①:首先定义接口 package com.demo.tools.view; /** * 数字动画自定义 * * @author zengtao 2015年7月17日 上午11:48:27 * */ public interface Ri

android 仿ppt进入动画效果合集

EnterAnimation android 仿ppt进入动画效果合集, 百叶窗效果,擦除效果,盒状效果,阶梯效果,菱形效果,轮子效果,劈裂效果,棋盘效果, 切入效果,扇形展开效果,十字扩展效果,随机线条效果,向内溶解效果,圆形扩展效果, 适用于各种view和viewgroup,activity即用于页面根部viewgroup, 自定义viewgroup自动换行layout, 看效果图 Series of entrance animation effects just like ppt in A

仿余额宝数字跳动效果 TextCounter

1.TextCounter 效果     2.TextCounter 说明 每次打开余额宝第一件事情就去看看有多少钱,最炫的就是看着钱在跳动相当的舒服,今天放出这个效果. 温馨提示:支持的Android版本最低的是Android 4.0.0 IceCreamSandwich ( API等级14 ) 3.TextCounter 使用 例子列表: Xml 中的使用方法 Java 中的使用方法 Xml 中的使用方法: <com.github.premnirmal.textcounter.Counter

仿余额宝数字渐慢跳动效果

找到一个开源Demo:https://github.com/PigRiver/NumberJumpDemo Demo里的都是整数间的跳转,想弄成带小数的跳转,很简单,只要到CATextLayer+NumberJump.m文件 里 changeNumberBySelector方法里修改成如下 float value = [(NSNumber *)[pointValues objectAtIndex:1] floatValue];就OK 仿余额宝数字渐慢跳动效果

android仿微信红包动画、Kotlin综合应用、Xposed模块、炫酷下拉视觉、UC浏览器滑动动画等源码

Android精选源码 仿微信打开红包旋转动画 使用Kotlin编写的Android应用,内容你想象不到 Android手机上的免Root Android系统日志Viewer 一个能让微信 Material Design 化的 Xposed 模块 仿最新版微信 Rxjava+Retrofit+MVP+Glide 技术开发 android一键清理/内存加速,缓存清理,自启管理,软件管理 android打造酷炫下拉视差效果并解决各种滑动冲突源码 android实现UC浏览器首页滑动动画实现 andr

仿网易‘垃圾箱’动画效果

一说到动画,大家会说到CSS3动画,确实,本文带来一片简单的仿网易'垃圾箱'动画效果,涉及到的知识点是transform.transition transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. transform: none|transform-functions; transition 属性是一个简写属性,用于设置四个过渡属性. transition: property duration timing-function delay; 首

android中设置Animation 动画效果

在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation 画面转换动画,接下来eoe进行讲解. tweened animation 渐变动画有以下两种类型: 1.alpha   渐变透明度动画效果 2.scale   渐变尺寸伸缩动画效果 frame by frame animation 画面转换动画有以下两种类型: 1.translate  画面转换位置

Android 实现蘑菇街购物车动画效果

版本:1.0 日期:2014.8.6 版权:© 2014 kince 转载注明出处 使用过蘑菇街的用户基本上都知道有一个加入购物车的动画效果,此处不具体描述想知道的可以去下载体验一下. 1.思路 目前想到两种方式实现这种效果,一是使用Tween动画,直截了当的进行一个移动,蘑菇街就是使用这样的方法.二是使用WindowManager创建一个View,然后对这个View进行移动. 2.实现 本文先用方式一方法实现,之后会用方式二方法实现. 方式一: Activity代码: package com.

Android Acitivy切换平移动画效果实现

1.在anim目录下新建anim文件夹,新建tran_in.xml和tran_out.xml分别表示下一页切换进入,和本页切换出去. 即in表示下一页向左平移,out表示同样向左平移至消失. tran_in.xml <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="100%p" X轴从100->0 android:toXDel