Android 自动动画布局更新 使用,Android TextView自定义数字滚动动画

背景

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

简介

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

效果图:

0585c344b90df158a361a6fb92b261d7.png

使用

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

framenum:动画的帧数,默认为30帧;

texttype:内容的格式,有money(金额、两位小数)和num(整数)两种格式,默认为0(金额格式);

usecommaformat:是否设置每三位数字一个逗号,默认为true(设置逗号显示);

runwhenchange:是否当内容改变的时候使用动画,反之则不使用动画,默认为true(内容改变时使用动画);

2.在xml布局文件中引用view

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" />

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);

}

}

项目地址 :传送门

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值