热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidTextView自定义数字滚动动画

这篇文章主要为大家详细介绍了AndroidTextView自定义数字滚动动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

背景

在开发需求当中,当有总收益、总用户数等数字要显示时,为了更好的给用户提供展示效果,往往会想加入炫酷的数字滚动动画,使呆板平静的数字变得灵活起来,给人一种增值的直观感受。

简介

NumberRollingView是一个自定义的自带数字滚动动画的TextView,通过使用setContent(String str)方法进行数字字符串设置,传入相应的金额数字字符串(如"9686.86")或者整数数字字符串(如"968"),设置的数字必须是正数。当显示页面初始化完成的过程中,就可以看到数字滚动的效果了。

效果图:

使用

1.在attr.xml中配置NumberRollingView的自定义属性


  
  
  
  
    
    
  
  
  
  
  


frameNum:动画的帧数,默认为30帧;
textType:内容的格式,有money(金额、两位小数)和num(整数)两种格式,默认为0(金额格式);
useCommaFormat:是否设置每三位数字一个逗号,默认为true(设置逗号显示);
runWhenChange:是否当内容改变的时候使用动画,反之则不使用动画,默认为true(内容改变时使用动画);

2.在XML布局文件中引用View





前者是金额数字View,后者是整数数字View。

3.Java文件中调用

tvMoney.setContent("9686.86");
tvNum.setContent("9686");

4.取消数字的自动格式化(设置每三位数字一个逗号)

默认情况下显示的数字经过了格式化处理,设置每三位数字添加一个逗号分隔,这使得数字看起来清晰明了,不会显得臃肿繁杂。如果不想将数字进行格式化处理,可以在布局文件中将useCommaFormat属性设置为false,或者在代码中设置setUseCommaFormat(boolean useCommaFormat)为false,这样显示的数字就不会是带有逗号了。

5.设置无论内容是否改变都要执行滚动动画

默认情况下NumberRollingView会自动判断传入的内容是否有变化,当内容发生变化时执行数字滚动动画,内容未变时不执行数字滚动动画。如果想无论内容是否有变化都要执行滚动动画的话,可以在布局文件中将runWhenChange属性设置为false,或者在代码中设置setRunWhenChange(boolean runWhenChange)为false,这样无论内容是否有变化都会执行滚动动画。

6.设置动画帧数

默认情况下数字滚动动画帧数为30帧,如果需要修改动画帧数,可根据实际需要在在布局文件中将frameNum属性设置为自己想要的帧数,或者在代码中设置setFrameNum(int frameNum)为自己想要的帧数即可。

7.数字字符串格式化(每三位数字添加一个逗号)

/**
 * @param str    字符串只能为两位小数或者整数
 * @param isDecimal 是否是小数
 * @Description 格式化字符串,每三位用逗号隔开
 */
public static String addComma(String str, boolean isDecimal) {
  //先将字符串颠倒顺序
  str = new StringBuilder(str).reverse().toString();
  if (str.equals("0")) {
    return str;
  }
  String str2 = "";
  for (int i = 0; i  str.length()) {
      str2 += str.substring(i * 3, str.length());
      break;
    }
    str2 += str.substring(i * 3, i * 3 + 3) + ",";
  }
  if (str2.endsWith(",")) {
    str2 = str2.substring(0, str2.length() - 1);
  }
  //最后再将顺序反转过来
  String temp = new StringBuilder(str2).reverse().toString();
  if (isDecimal) {
    //去掉最后的","
    return temp.substring(0, temp.lastIndexOf(",")) + temp.substring(temp.lastIndexOf(",") + 1, temp.length());
  } else {
    return temp;
  }
}

8.开始金额数字动画的方法

如果传入的金额中包含格式化的字符如","或"-"符号,就将符号去除;将传入的数字进行格式转换,转换为Double类型的金额格式,如果发生转换异常则直接进行显示;同时判断传入的数字大小,如果为0则直接显示,若不为0则设置每帧间隔的大小,发送Message消息给Handler进行内容的更新。

/**
 * @Description 开始金额数字动画的方法
 */
public void startMoneyAnim(String moneyStr) {
  // 如果传入的数字已经格式化了,则将包含的符号去除
  String mOney= moneyStr.replace(",", "").replace("-", "");
  try {
    finalMOneyNum= Double.parseDouble(money);
    if (finalMOneyNum== 0) {
      // 如果传入的数字为0则直接使用setText()进行显示
      NumberRollingView.this.setText(moneyStr);
      return;
    }
    nowMOneyNum= 0;
    threadPool.execute(new Runnable() {
      @Override
      public void run() {
        Message msg = handler.obtainMessage();
        // 将传入的数字除以帧数,得到每帧间隔的大小
        double size = finalMoneyNum / frameNum;
        msg.what = MONEY_TYPE;
        // 如果每帧的间隔小于0.01,则设置间隔为0.01
        msg.obj = size <0.01 &#63; 0.01 : size;
        // 发送消息改变UI
        handler.sendMessage(msg);
      }
    });
  } catch (NumberFormatException e) {
    e.printStackTrace();
    //如果转换Double失败则直接用setText()
    NumberRollingView.this.setText(moneyStr);
  }
}

9.开始数字动画的方法

同上述金额数字一般,先进行格式化符号去除,然后进行类型转换,将其转换为Integer类型的整数格式,如果发生转换异常则直接进行显示;为了更加人性化,我们将传入的数字与帧数作了比较,如果数值小于帧数就直接显示,当然你想不管数字大小都能进行动画展示,只需将下面的帧数间隔的获取稍加改造即可;若大于等于设置的帧数则设置每帧间隔的大小,发送Message消息给Handler进行内容的更新。

/**
 * @Description 开始数字动画的方法
 */
public void startNumAnim(String numStr) {
  // 如果传入的数字已经格式化了,则将包含的符号去除
  String num = numStr.replace(",", "").replace("-", "");
  try {
    finalNum = Integer.parseInt(num);
    if (finalNum 

项目地址 :传送门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
author-avatar
手机用户2502939333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有