TextView 数字自动增长
来源:互联网 发布:java面向对象的特点 编辑:程序博客网 时间:2024/05/17 09:36
就是一个TextView每个数子,不停的改变数值的书,在目标值停下来—直接上图(原谅我不会上传gif)
第一张(注意看标注)
第二张(注意看标注)
第三张(注意看标注,这里声明的textview是一个自定义的o)
我想大致的动画想过,你们可以想想的出来,具体的实现我就不说了(代码有详细注释),直接应用我的代码,你就可以直接使用
第一步:写一个接口
package com.lzyc.ybtappcal.widget;/** * 增长的数字接口 * */public interface IRiseNumber { /** * 开始播放动画的方法 */ public void start(); /** * 设置小数 * * @param number * @return */ public void withNumber(float number); /** * 设置整数 * * @param number * @return */ public void withNumber(int number); /** * 设置动画播放时长 * * @param duration * @return */ public void setDuration(long duration); /** * 设置动画结束监听器 * * @param callback */ public void setOnEndListener(RiseNumberTextView.EndListener callback);}
第二步:自定义TextView(继承textview,并且实现我们刚刚写的接口)
package com.lzyc.ybtappcal.widget;import android.content.Context;import android.util.AttributeSet;import android.widget.TextView;import com.lzyc.ybtappcal.R;import com.nineoldandroids.animation.ValueAnimator;import java.text.DecimalFormat;public class RiseNumberTextView extends TextView implements IRiseNumber { private static final int STOPPED = 0; private static final int RUNNING = 1; private int mPlayingState = STOPPED; private float number; private float fromNumber; /** * 动画播放时长 */ private long duration = 1500; /** * 1.int 2.float */ private int numberType = 2; private DecimalFormat fnum; private EndListener mEndListener = null; final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE}; public RiseNumberTextView(Context context) { super(context); } /** * 使用xml布局文件默认的被调用的构造方法 * * @param context * @param attr */ public RiseNumberTextView(Context context, AttributeSet attr) { super(context, attr); setTextColor(context.getResources().getColor(R.color.rise_number_text_color_white)); setTextSize(12); } public RiseNumberTextView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); } /** * 判断动画是否正在播放 * * @return */ public boolean isRunning() { return (mPlayingState == RUNNING); } /** * *跑小数动画 */ private void runFloat() { ValueAnimator valueAnimator = ValueAnimator.ofFloat(fromNumber, number); valueAnimator.setDuration(duration); valueAnimator .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { setText(fnum.format(Float.parseFloat(valueAnimator .getAnimatedValue().toString()))); if (valueAnimator.getAnimatedFraction() >= 1) { mPlayingState = STOPPED; if (mEndListener != null) mEndListener.onEndFinish(); } } }); valueAnimator.start(); } /** * 跑整数动画 */ private void runInt() { ValueAnimator valueAnimator = ValueAnimator.ofInt((int) fromNumber, (int) number); valueAnimator.setDuration(duration); valueAnimator .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { setText(valueAnimator.getAnimatedValue().toString()); if (valueAnimator.getAnimatedFraction() >= 1) { mPlayingState = STOPPED; if (mEndListener != null) mEndListener.onEndFinish(); } } }); valueAnimator.start(); } static int sizeOfInt(int x) { for (int i = 0; ; i++) { if (x <= sizeTable[i]) return i + 1; } } @Override protected void onFinishInflate() { super.onFinishInflate(); fnum = new DecimalFormat("##0.00"); } /** * 开始播放动画 */ @Override public void start() { if (!isRunning()) { mPlayingState = RUNNING; if (numberType == 1) runInt(); else runFloat(); } } /** * 设置一个小数进来 */ @Override public void withNumber(float number) { this.number = number; numberType = 2; if (number > 1000) { fromNumber = number - (float) Math.pow(10, sizeOfInt((int) number) - 1); } else { fromNumber = number / 2; } } /** * 设置一个整数进来 */ @Override public void withNumber(int number) { this.number = number; numberType = 1; if (number > 1000) { fromNumber = number - (float) Math.pow(10, sizeOfInt((int) number) - 2); } else { fromNumber = number / 2; } } /** * 设器置动画时长 */ @Override public void setDuration(long duration) { this.duration = duration; } /** * 设器置动画结束监听 */ @Override public void setOnEndListener(EndListener callback) { mEndListener = callback; } /** * 定义动画结束接口 */ public interface EndListener { /** * 当动画播放结束时的回调方法 */ public void onEndFinish(); }}
第三步:需要显示的xml中应用自定义textview
<com.lzyc.ybtappcal.widget.RiseNumberTextView android:id="@+id/id_drugs_detail_shequ_paymyself" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.00" android:textColor="@color/color_ffffff" android:textSize="@dimen/text_font_13" />
第四部:代码执行开始动画
/** * 数字自动增长 * * @param number 数值的目标数(最后的值) * @param view 自定义的RiseNumberTextView */ private void startNumberAutoUp(RiseNumberTextView view, String number) { view.withNumber(Float.parseFloat(number)); // 设置动画播放时间 view.setDuration(1500); // 开始播放动画 view.start(); }
最后:OK搞定,具体细节直接看代码
1 0
- TextView 数字自动增长
- 自定义View实现自动数字增长的TextView
- Android 自定义TextView 左右滑动实现数字自增长
- textview数字英文在一起时自动换行
- sql service重置自动增长字段数字的方法
- 自动增长
- 自动增长
- 自动增长
- 安卓自定义View——(一:RaiseNumberAnimTextView 带数字增长动画的TextView)
- 编号字段以字母和数字组成,并且数字可以自动增长
- 数字排序,波动增长
- 自动增长的ID,插入特定的数字 set identity_insert ON OR OFF
- weblogic自动增长主键
- Oracle自动增长
- Excel自动增长列
- oracle 实现自动增长
- Oracle ID自动增长
- Oracle设置自动增长
- yii框架登录s
- 使用WinDbg —— .NET篇 (十三)
- hdu3183 A Magic Lamp(RMQ)
- 算法基础知识科普:8大搜索算法之红黑树(下)
- Mysql性能排优
- TextView 数字自动增长
- 判断APP是启动方式
- Leetcode Maximum Subarray
- Spring+Websocket实现消息的推送
- windows下wamp配置redis扩展
- Java EE中编码方式
- 学习前端目前已有两月有余
- Print1ToMaxNDigits
- Android 自定义带动画效果的开关按钮