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 ...
 
随机推荐
- PowerManager和PowerManager.WakeLock详解
			
最近在做项目过程中,有一个LocalPush的需求,需要保持屏幕点亮一段时间,并且在这个时间里,启动Service来执行请求服务器的操作,拿到热点的数据.所以,就找了一下相关的android开源项目. ...
 - JavaScript通过ID和name设置样式
			
JavaScript通过ID和name设置样式 1.说明 (1)根据所提供的元素的id值,返回对该元素的引用或节点 document.getElementById("tr_th") ...
 - windows驱动之WDF---CharSample
			
驱动程序部分: NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /*++ ...
 - Openstack_O版(otaka)部署_镜像服务glance部署
			
安装和配置服务 1. 建库建用户 mysql -u root -p CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO '; GRA ...
 - WPF中使用WebBrowser
			
最近在做北京现代项目的时候,遇到一个需求将韩国那边写好的网页嵌套到WPF程序中显示. 开始的时候使用的是第三方的浏览器控件:awesomium,在本地测试,显示没有问题.但是拿到客户现场,只显示半屏. ...
 - HttpServletResponse,HttpServletRequest详解
			
1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...
 - ASP.NET WebForm 通过 PagedDataSource 实现 Repeater 的分页
			
1.效果图&代码说明 1.效果图 2.代码说明 1.翻页按钮 前台两个LinkButton(上一页.下一页),设置不同的CommandName.CommandArg ...
 - HDU 3416 Marriage Match IV(最短路,网络流)
			
题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...
 - [BZOJ1606] [Usaco2008 Dec] Hay For Sale 购买干草 (dp)
			
Description 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每 ...
 - CodeIgniter怎么引入公共的头部或者尾部文件(实现随意引入或分区域创建header.html,bodyer.html,footer.html)
			
除非你天赋异禀,凡事基本对任何人来说都是开头难的,且开头的事情如果没有做好 往往会打掉一个人对于某件事的希望及其激情,所以咱们先从容易的事情开始慢慢建立自己 信心.后面的事情咱们再慢慢推进. 如果你是 ...