Android TextView自定义数字滚动动画
发布时间 - 2026-01-11 00:53:15 点击率:次背景

在开发需求当中,当有总收益、总用户数等数字要显示时,为了更好的给用户提供展示效果,往往会想加入炫酷的数字滚动动画,使呆板平静的数字变得灵活起来,给人一种增值的直观感受。
简介
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省略号样式的方法
# 帧数
# 默认为
# 设置为
# 都要
# 两位
# 情况下
# 自定义
# 转换为
# 则将
# 是一个
# 发送消息
# 都能
# 两种
# 只需
# 你想
# 将其
# 作了
# 给人
# 用户提供
# 就将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
EditPlus 正则表达式 实战(3)
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
在线制作视频网站免费,都有哪些好的动漫网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel怎么在Blade中安全地输出原始HTML内容
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel API资源类怎么用_Laravel API Resource数据转换
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何用PHP快速搭建高效网站?分步指南
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel如何为API生成Swagger或OpenAPI文档
动图在线制作网站有哪些,滑动动图图集怎么做?
如何制作一个表白网站视频,关于勇敢表白的小标题?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何在腾讯云服务器上快速搭建个人网站?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
JavaScript如何实现音频处理_Web Audio API如何工作?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
桂林网站制作公司有哪些,桂林马拉松怎么报名?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
香港服务器网站推广:SEO优化与外贸独立站搭建策略
iOS中将个别页面强制横屏其他页面竖屏
javascript基本数据类型及类型检测常用方法小结
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何在香港免费服务器上快速搭建网站?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
JavaScript实现Fly Bird小游戏
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
如何用搬瓦工VPS快速搭建个人网站?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】

