支付宝更新9.0后,细心的朋友会发现新增了一个动画效果,就是进入我的钱包的时候,我的余额会有一段滚动显示的动画效果,比如说你有100块,余额就从0滚动到100,看到自己的钱在不断涨,让我们这些穷屌丝莫名产生一种似乎很有钱的幻觉,于是就会带着这种幻觉想要去天猫消费消费。。。于是我也仿了一个支付宝的滚动效果,如下图,也许这样能让我们的用户也感觉自己很有钱。

仿支付宝滚动效果:

在做这个效果之前,我也习惯性的在网上搜索了一番,做这种效果的比较少,但也能找到这样的开源代码,自己也下下来看了一下,但是自己感觉不好的是网上把这种效果做成了一个控件,继承TextView来实现这样的效果,而且一个库好歹也有5、6个类,实在有点杀鸡用牛刀的感觉,于是自己写了一下,实际实现代码100行都不到。我把它封装成一个静态工具类,方便调用:

先放使用方法,在上代码。

使用方法:

  1. 把NumAnim类添加到自己工程
  2. 在需要使用滚动效果的地方调用startAnim方法即可,例如:
NumAnim.startAnim(textView, 1253.47);   //第二个参数是textView要显示的价格

滚动时间默认是500毫秒,如果你需要自己设置,可以调用下面的重置方法:

NumAnim.startAnim(textView, 1253.47, 1000);     //设置滚动动画持续1秒

下面上NumAnim类源码:

NumAnim.java:

import java.util.LinkedList;
import java.util.Random;
import android.widget.TextView;
import com.ccrv.cber.util.NumUtil;public class NumAnim {//每秒刷新多少次private static final int COUNTPERS = 100;public static void startAnim(TextView textV, float num) {startAnim(textV, num, 500);}public static void startAnim(TextView textV, float num, long time) {if (num == 0) {textV.setText(NumUtil.NumberFormat(num,2));return;}Float[] nums = splitnum(num, (int)((time/1000f)*COUNTPERS));Counter counter = new Counter(textV, nums, time);textV.removeCallbacks(counter);textV.post(counter);}private static Float[] splitnum(float num, int count) {Random random = new Random();float numtemp = num;float sum = 0;LinkedList<Float> nums = new LinkedList<Float>();nums.add(0f);while (true) {float nextFloat = NumUtil.NumberFormatFloat((random.nextFloat()*num*2f)/(float)count, 2);System.out.println("next:" + nextFloat);if (numtemp - nextFloat >= 0) {sum = NumUtil.NumberFormatFloat(sum + nextFloat, 2);nums.add(sum);numtemp -= nextFloat;} else {nums.add(num);return nums.toArray(new Float[0]);}}}static class Counter implements Runnable {private final TextView view;private Float[] nums;private long pertime;private int i = 0;Counter(TextView view,Float[] nums,long time) {this.view = view;this.nums = nums;this.pertime = time/nums.length;}@Overridepublic void run() {if (i>nums.length-1) {view.removeCallbacks(Counter.this);return;}view.setText(NumUtil.NumberFormat(nums[i++],2));view.removeCallbacks(Counter.this);view.postDelayed(Counter.this, pertime);}}
}

注意上面代码,直接导入会报错,因为你没有NumUtil.NumberFormat()和NumberFormatFloat()这2个方法,这个方法我写在工具类里的,作用是保留2位小数,一个返回String一个返回float,我把这2个方法贴上,自行添加:

    public static String NumberFormat(float f,int m){return String.format("%."+m+"f",f);}public static float NumberFormatFloat(float f,int m){String strfloat = NumberFormat(f,m);return Float.parseFloat(strfloat);}

其实也就2行而已。

下面解释下源码:

其实就是通过一种算法把价格拆分成了n个float组成的集合,然后在使用循环把这些float设置到TextView上。

这里主要利用了View的postDelayed(Runable action, int delayMillis)方法给TextView设置一个Runable线程对象在delayMillis毫秒后执行,我们自定义这个Runable,在线程主方法run()中重复调用postDelayed(…)来实现循环执行动画的效果。

    @Overridepublic void run() {if (i>nums.length-1) {view.removeCallbacks(Counter.this);return;}view.setText(NumUtil.NumberFormat(nums[i++],2));view.removeCallbacks(Counter.this);view.postDelayed(Counter.this, pertime);}

这个方法其实并没有什么动画,而是重复调用setText来设置不同的价格,这个价格来自于一个float数组nums[]
就是说我们在调用post方法前,先需要把我们的价格num拆分成n个float的集合,集合每一个float就是动画过程中显示的数字,如下举例:

//假如传入的价格num为: 1024.32
//那么我们期望获得下面这样一个集合:
24.23
56.44
123.34
353.12
745.2
876.56
1003.03
1024.32
//这样就可以把上面这组数据依次显示上去就可以了

那么我们怎么来获得这个集合呢?我提供了一个算法,方法如下:

    private static Float[] splitnum(float num, int count) {Random random = new Random();float numtemp = num;float sum = 0;LinkedList<Float> nums = new LinkedList<Float>();nums.add(0f);while (true) {float nextFloat = NumUtil.NumberFormatFloat((random.nextFloat()*num*2f)/(float)count, 2);System.out.println("next:" + nextFloat);if (numtemp - nextFloat >= 0) {sum = NumUtil.NumberFormatFloat(sum + nextFloat, 2);nums.add(sum);numtemp -= nextFloat;} else {nums.add(num);return nums.toArray(new Float[0]);}}}

这个方法就是用来拆分价格,获取一个递增集合的,这里我严格限制结果保留2位小数,需要自定义可以自行修改,方法的第一参数num是需要拆分的数,方法的第二个参数count是指期望这个数被拆分成多少份。但这个count并不是绝对的,可能会比你期望的多一些或者少一些。因为方法中使用随机函数来生成每一个float,产生的随机数数量会接近你设置的count但并不一定相等。

具体实现就看看代码把,十几行代码相信看得懂没问题。

我仔细观察注意到支付宝的余额滚动效果有一个慢慢递减的过程,就是说,开始滚动一下的数字累加得比较大,可能是1000,2000(根据你的余额决定),到后面就比较小比如0.5,0.05 。这样会使动画产生一个慢慢首尾的效果,感觉先滚动高位的数字,到最后,高位不变了接着滚动末尾的数字,这样的效果更加流畅平滑。如果感兴趣的朋友也想要这样的效果,那就重写上面的splitnum()方法吧,使这个方法产生的float,先产生大数字,慢慢减小,最后产生小数。这样执行起来就和支付宝非常类似了。

android开发游记:仿支付宝余额数字累加滚动效果的实现相关推荐

  1. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  2. android支付宝余额怎么做,android编程实现类似于支付宝余额快速闪动效果的方法...

    本文实例讲述了android编程实现类似于支付宝余额快速闪动效果的方法.分享给大家供大家参考,具体如下: 效果如下: 此图片不会动,但实际上是会快速跳动的. 之前看到有支付宝的效果非常牛逼.就是进去看 ...

  3. android wear支付宝6,Android自定义View仿支付宝输入六位密码功能

    跟选择银行卡界面类似,也是用一个PopupWindow,不过输入密码界面是一个自定义view,当输入六位密码完成后用回调在Activity中获取到输入的密码并以Toast显示密码.效果图如下: 自定义 ...

  4. Android实现动态贴纸,Android开发之仿微博贴纸效果实现——进阶篇

    上个月写了一篇<Android开发之仿微博贴纸效果实现--基础篇>,文章中提到还有一篇进阶篇要写,很早就想动笔了,因中途去维护了开源库<高仿微信图片选择器2.0版本>,导致耽搁 ...

  5. 直播app源代码 直播软件开发Android UI动画 仿直播点赞飘心动画效果

    直播app源代码 直播软件开发Android UI动画 仿直播点赞飘心动画效果 一个飘心的小动画,之前看也看到网上有很多轮子,但是感觉不是很符合我的需求,所以自己就凑活凑活搞出来一个,废话不多说先看图 ...

  6. 支付宝 android ui,Android 仿支付宝芝麻信用分仪表盘效果 CreditSesameRingView

    软件介绍 自定义View之仿支付宝芝麻信用分仪表盘效果,喜欢的话,请给个star,谢谢. 使用添加项目依赖Add it in your root build.gradle at the end of  ...

  7. 仿支付宝/微信的password输入框效果GridPasswordView解析

    仿支付宝/微信的password输入框效果GridPasswordView解析,把一些设置和一些关键的地方列了出来,方便大家使用,可能能够省一部分的时间,也算是自己的积累吧. 1.password框能 ...

  8. Android开发学习之基于ViewPager实现Gallery画廊效果

    通过我们前面的学习,我们知道ViewPager是可以做出近乎完美的滑动体验,回顾整个Android,我们发现Gallery具备同样的特点,于是我们大胆地猜想,Gallery是否和ViewPager之间 ...

  9. Android属性动画实现TextView类似支付宝余额数字滚动

    Demo下载链接 项目中的小需求,完成类似于支付宝余额的数字滚动效果,找了网上的一个小demo,再加上郭婶的关于属性动画的文章,整理一部分代码分享给有需要的人. 下面贴出封装的TextView代码片段 ...

最新文章

  1. Python基础16-模块与包基础01
  2. Oracle 11g-oracle 启动与关闭
  3. Node 深入Stream(2)
  4. es配置中防止脑裂的配置
  5. 转:MFC中创建多线程
  6. ubuntu 导入mysql_Ubuntu 下MySQL导入数据库.sql文件 命令
  7. 在阿里云里申请免费Https证书SSL
  8. git 生成多个patch_如何用git命令生成Patch和打Patch
  9. mingw64 下 java,如何安装MinGW-w64和MSYS2?
  10. ipv6电视直播Android,关于高校电视直播(ipv4ipv6)
  11. 运用网络执法官实现网络监控
  12. 网站添加错误页面提示功能(404、500错误提示)
  13. python爬虫-国家企业_国家企业信用公示系统的爬取
  14. 对京东商品评论进行词频统计并制作词云
  15. 创客匠人用户分组:用户定向运营,不浪费一滴流量
  16. gethostbyname和struct hostent详解
  17. iPad最值得期待的切实改进构想
  18. Java基础学习系列--(二)【抽象类,接口、代码块、final、单例、枚举】
  19. LNK 2001错误
  20. 在centos上搭建饥荒服务器

热门文章

  1. Java核心类库(上)
  2. 基于身份证识别的JavaWeb驾校管理系统的设计与实现
  3. MyBatis-Plus 快速入门案例
  4. Windows内置系统账户:Local system/Network service/Local Service 区别
  5. html实现多种风格的时间轴(附源码)
  6. html 手写签名 撤销,[转]H5 canvas手写签名
  7. visio2016下载地址中文版32位中文版64位
  8. 计算机流行音乐数字乐谱,求流行歌曲简谱(要数字的,不要发网站过来)
  9. iOS系统导航/自绘制导航路线
  10. 【文献管理】JabRef使用教程、建立文献库、分组、添加文献、jabref推送到tex中