全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android TextView自定义数字滚动动画

背景

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

简介

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

效果图:

使用

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

<declare-styleable name="NumberRollingView">
  <!--帧数-->
  <attr name="frameNum" format="integer"></attr>
  <!--内容的格式-->
  <attr name="textType">
    <enum name="money" value="0"></enum>
    <enum name="num" value="1"></enum>
  </attr>
  <!--是否设置每三位数字一个逗号-->
  <attr name="useCommaFormat" format="boolean"></attr>
  <!--是否当内容改变的时候使用动画,反之则不使用动画-->
  <attr name="runWhenChange" format="boolean"></attr>
</declare-styleable>

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

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

<com.wiggins.digitalchange.widget.NumberRollingView
  android:id="@+id/tv_money"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="0.00"
  android:textColor="@color/white"
  android:textSize="@dimen/font_max"
  android:textStyle="bold" />

<com.wiggins.digitalchange.widget.NumberRollingView
  android:id="@+id/tv_num"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="0"
  android:textColor="@color/white"
  android:textSize="@dimen/font_max"
  android:textStyle="bold"
  app:textType="num" />

前者是金额数字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(); i++) {
    if (i * 3 + 3 > 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 ? 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 < frameNum) {
      // 如果传入的数字比帧数小,则直接使用setText()
      NumberRollingView.this.setText(numStr);
      return;
    }
    // 默认从0开始动画
    nowNum = 0;
    threadPool.execute(new Runnable() {
      @Override
      public void run() {
        Message msg = handler.obtainMessage();
        // 将传入的数字除以帧数,得到每帧间隔的大小
        int temp = finalNum / frameNum;
        msg.what = NUM_TYPE;
        msg.obj = temp;
        // 发送消息改变UI
        handler.sendMessage(msg);
      }
    });
  } catch (NumberFormatException e) {
    e.printStackTrace();
    //如果转换Integer失败则直接用setText
    NumberRollingView.this.setText(numStr);
  }
}

项目地址 :传送门

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


# Android  # TextView  # 滚动  # android开发教程之textview内容超出屏幕宽度显示省略号  # Android设置TextView显示指定个数字符  # 超过部分显示...(省略号)的方法  # Android中Textview和图片同行显示(文字超出用省略号  # 图片自动靠右边)  # Android设置当TextView中的文字超过TextView的容量时用省略号代替  # 解析在Android中为TextView增加自定义HTML标签的实现方法  # Android TextView显示Html类解析的网页和图片及自定义标签用法示例  # Android自定义View之继承TextView绘制背景  # Android自定义TextView实现文字倾斜效果  # Android 自定义TextView实现文本内容自动调整字体大小  # Android自定义竖排TextView实现实例  # Android自定义textview实现竖直滚动跑马灯效果  # Android开发自定义TextView省略号样式的方法  # 帧数  # 默认为  # 设置为  # 都要  # 两位  # 情况下  # 自定义  # 转换为  # 则将  # 是一个  # 发送消息  # 都能  # 两种  # 只需  # 你想  # 将其  # 作了  # 给人  # 用户提供  # 就将 


相关文章: 建站之星多图banner生成与模板自定义指南  内网网站制作软件,内网的网站如何发布到外网?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站主机是否等同于虚拟主机?  西安专业网站制作公司有哪些,陕西省建行官方网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  建站之星后台密码遗忘如何找回?  如何在建站之星绑定自定义域名?  建站主机默认首页配置指南:核心功能与访问路径优化  建站主机选择指南:服务器配置与SEO优化实战技巧  如何制作算命网站,怎么注册算命网站?  海南网站制作公司有哪些,海口网是哪家的?  如何使用Golang安装API文档生成工具_快速生成接口文档  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  网站制作壁纸教程视频,电脑壁纸网站?  网站制作服务平台,有什么网站可以发布本地服务信息?  如何在西部数码注册域名并快速搭建网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何快速查询网址的建站时间与历史轨迹?  宝塔建站无法访问?如何排查配置与端口问题?  广州营销型建站服务商推荐:技术优势与SEO优化解析  ,网站推广常用方法?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  建站之星24小时客服电话如何获取?  建站之星伪静态规则如何正确配置?  表情包在线制作网站免费,表情包怎么弄?  如何续费美橙建站之星域名及服务?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  Swift中循环语句中的转移语句 break 和 continue  如何正确选择百度移动适配建站域名?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何在万网开始建站?分步指南解析  如何快速搭建高效简练网站?  如何正确下载安装西数主机建站助手?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何在阿里云ECS服务器部署织梦CMS网站?  制作表格网站有哪些,线上表格怎么弄?  如何配置IIS站点权限与局域网访问?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  建站之星如何一键生成手机站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  济南网站制作的价格,历城一职专官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。