Android TextView数字增长动画效果
某些app上,新进入一个Activity的时候,上面的一个关键性数字(比如金额)会以一个数字不断变大的动画来显示。刚开始的时候,想到的一个方案是:使用Thead+Handler,给定一个动画总时长与刷新间隔时长,根据公式(数字从0开始,每次增长值为数组除以动画执行次数,动画执行次数等于动画总时长除以刷新间隔时长);
每隔一段时间重新设置TextView的字符串为增加后的值,直到动画结束显示最终结果。
其实对安卓动画有一定了解的应该都知道ValueAnimator这个类,我们可以使用它来很好的实现所要的效果,而不需要我们自己来生硬的控制隔多久就增加多少刷新显示。根据ValueAnimator的属性方法以及实际需要,我们封装一个自定义View来实现我们的需求。
先看一下我实现的效果图

接下来上关键代码:
自定义View,其实就是继承一个TextView,代码实现很简单,代码中也有注释
/**
* Created by dingchao on 2018/3/27.
*/ public class DcTextViewRunNumber extends TextView { /**
* 延迟
*/
private final int DELAY = 20;
/**
* 保留小数位数 默认2为
*/
private final int DECIMALS_COUNT = 2;
private final int START_RUN = 101;
private final int STOP_RUN = 102;
/**
* 跑的次数
*/
private final int RUN_COUNT = 40;
private float speed;
private float startNum;
private float endNum;
/**
* 保留小数位数
*/
private int decimals = DECIMALS_COUNT;
/**
* 每次跑的次数
*/
private int runCount = RUN_COUNT;
/**
* 动画延迟
*/
private int delayMillis = DELAY;
private boolean isAniming; private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == START_RUN) {
if(speed==0){
if(endNum!=0){
speed = getSpeed();
startNum = speed;
}else{
return ;
}
}
isAniming = !running();
if (isAniming) {
sendEmptyMessageDelayed(START_RUN, delayMillis);
}else{
speed = 0;
startNum = 0;
}
}
};
}; public DcTextViewRunNumber(Context context) {
super(context);
} public DcTextViewRunNumber(Context context, AttributeSet attrs) {
super(context, attrs);
} public DcTextViewRunNumber(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**
* 开始数字跳动动画
* @return 动画是否结束
*/
private boolean running() {
setText(withDEC(String.valueOf(startNum)) + "");
startNum +=speed;
if(startNum >= endNum){
setText(withDEC(String.valueOf(endNum)) + "");
return true;
}
return false;
} /**
* 计算速度
* @return
*/
private float getSpeed(){
float speedFloat = withDEC(String.valueOf(endNum/runCount)).floatValue();
return speedFloat;
} /**
* 判断是否是非负数
* @return
*/
private boolean isNumber(String num){
if("".equals(num) || num==null)
return false;
Pattern pattern = Pattern.compile("^\\d+$|\\d+\\.\\d+$");
Matcher matcher = pattern.matcher(num);
return matcher.find();
} /**
* 取整四舍五入 保留小数
* @param num
* @return
*/
private BigDecimal withDEC(String num){
return new BigDecimal(num).setScale(decimals, BigDecimal.ROUND_HALF_UP);
} /**
* 设置显示的数字
* @param num
*/
public void setShowNum(String num){
setShowNum(num,DECIMALS_COUNT);
} /**
* 设置显示的数字
* @param num
* @param decimals 要保留的小数位
*/
public void setShowNum(String num,int decimals){
if(!isNumber(num)){
return;
}
setText(num);
setDecimals(decimals);
} /**
* 开始跑
*/
public void startRun(){
if(isAniming){
return ;
}
if(isNumber(getText().toString())){
endNum = withDEC(getText().toString()).floatValue();
mHandler.sendEmptyMessage(START_RUN);
}
} public int getDecimals() {
return decimals;
} /**
* 设置保留的小数位 0:不保留小数
* @param decimals
*/
public void setDecimals(int decimals) {
if(decimals>=0){
this.decimals = decimals;
}
setText(withDEC(getText().toString())+"");
} public int getRunCount() {
return runCount;
} /**
* 设置动画跑的次数
* @param runCount
*/
public void setRunCount(int runCount) {
if(runCount<=0){
return ;
}
this.runCount = runCount;
} public int getDelayMillis() {
return delayMillis;
} /**
* 设置动画延迟
* @param delayMillis
*/
public void setDelayMillis(int delayMillis) {
this.delayMillis = delayMillis;
}
接下来看怎么使用,MainActivity.java中
public class MainActivity extends AppCompatActivity {
private DcTextViewRunNumber numberRunView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
numberRunView = (DcTextViewRunNumber) findViewById(R.id.numberRunView);
numberRunView.setShowNum("711", 0);//终止的数字,小数点,这里为0所以没有小数点
numberRunView.setRunCount(50);//动画执行的次数,50次执行完
// numberRunView.setShowNum("221.918899");
numberRunView.startRun();//
}
/**
* @param view
*/
public void runClick(View view) {
numberRunView.startRun();
}
}
activity_main.xml也贴一下吧,贴全了吧
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"> <cn.up.com.textviewrun.DcTextViewRunNumber
android:id="@+id/numberRunView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="123"
android:textSize="30sp" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="runClick"
android:text="跑" /> </LinearLayout>
主要的就是这三个文件,代码都全部贴出来了,效果也还可以。开发中不要重复造轮子,有的改一下就可以直接用咯。
Android TextView数字增长动画效果的更多相关文章
- android中设置Animation 动画效果
在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现,一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...
- Android Acitivy切换平移动画效果实现
1.在anim目录下新建anim文件夹,新建tran_in.xml和tran_out.xml分别表示下一页切换进入,和本页切换出去. 即in表示下一页向左平移,out表示同样向左平移至消失. tran ...
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- Android实现控件动画效果
MainActivity.java public class MainActivity extends AppCompatActivity { private ImageView iv; privat ...
- 【转】Android 实现蘑菇街购物车动画效果
原文出处:http://blog.csdn.net/wangjinyu501/article/details/38400479 1.思路 目前想到两种方式实现这种效果,一是使用Tween动画,直截 ...
- Android 实现蘑菇街购物车动画效果
版本号:1.0 日期:2014.8.6 版权:© 2014 kince 转载注明出处 使用过蘑菇街的用户基本上都知道有一个增加购物车的动画效果,此处不详细描写叙述想知道的能够去下载体验一下. 1 ...
- Android开发之View动画效果插补器Interpolator
插补器Interpolator 官网描述:An interpolator defines the rate of change of an animation. This allows the bas ...
- Android 之Activity切换动画效果
在Activity中Android提供了overridePendingTransition(int enterAnim,int exitAnim)这个方法用于设置Activity之间切换的动画效果.o ...
- Android 为PopupWindow设置动画效果
首先定义显示效果的动画文件: <?xml version="1.0" encoding="utf-8"?> <set xmlns:androi ...
随机推荐
- NLP︱LDA主题模型的应用难题、使用心得及从多元统计角度剖析
将LDA跟多元统计分析结合起来看,那么LDA中的主题就像词主成分,其把主成分-样本之间的关系说清楚了.多元学的时候聚类分为Q型聚类.R型聚类以及主成分分析.R型聚类.主成分分析针对变量,Q型聚类针对样 ...
- 图像处理------基于Otsu阈值二值化
一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值 ...
- Java中的switch语句后面的控制表达式的数据类型
Java中的switch语句后面的控制表达式的数据类型 1.byte 2.char 3.short 4.int 5.枚举类型 6.Java 7允许java.lang.String类型
- HQL查询步骤
HQL查询步骤 1.获取Hibernate Session对象 2.编写HQL语句 3.以HQL语句作为参数,调用Session的createQuery方法创建查询对象 4.HQL语句包含参数,则调用 ...
- HTML5中的checkbox
HTML5中的checkbox 1.选中checkbox (1)<input type="checkbox" checked/> (2)<input type=& ...
- 芝麻HTTP:Python爬虫入门之正则表达式
1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...
- 生成report由Eamil定時寄出
Blat 是一个命令行发邮件的小工具,仅支持简单的SMTP协议,需要SMTP服务器的支持. 官网:http://www.blat.net/ 下载地址:https://sourceforge.ne ...
- Xampp apache与mySQL开不了 解决办法
Xampp安装后,打开Xampp control panel. 点击Apache对应的Start,开不了.原因是系统的服务占用了80端口,所以要么结束系统服务,要么修改apache端口. 个人比较喜欢 ...
- 【BZOJ1207】【HNOI2004】打鼹鼠(动态规划)
[BZOJ1207][HNOI2004]打鼹鼠 题面 BZOJ题面 题解 考虑到m的范围只有10000 O(m^2)的复杂度是可以接受的 所以直接暴力DP 每次枚举前面出现的鼹鼠 检查是否能够转移过来 ...
- [BZOJ3275] Number (网络流)
Description 有N个正整数,需要从中选出一些数,使这些数的和最大. 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 ...