1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android属性动画实现TextView类似支付宝余额数字滚动

Android属性动画实现TextView类似支付宝余额数字滚动

时间:2021-08-08 13:26:01

相关推荐

Android属性动画实现TextView类似支付宝余额数字滚动

Demo下载链接

项目中的小需求,完成类似于支付宝余额的数字滚动效果,找了网上的一个小demo,再加上郭婶的关于属性动画的文章,整理一部分代码分享给有需要的人.

下面贴出封装的TextView代码片段,主要是利用属性动画来更新TextView完成数字滚动更新.

package .numberscrolldemo.view;import android.animation.ValueAnimator;import android.content.Context;import android.util.AttributeSet;import android.widget.TextView;import java.text.DecimalFormat;import .numberscrolldemo.R;/*** NumberScrollTextView,用属性动画完成数字平滑滚动* created by shidong*/public class NumberScrollTextView 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 = 1000;/*** 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};/*** 构造方法** @param context*/public NumberScrollTextView(Context context) {super(context);}/*** 构造方法** @param context* @param attr*/public NumberScrollTextView(Context context, AttributeSet attr) {super(context, attr);setTextColor(context.getResources().getColor(R.color.black));setTextSize(30);}public NumberScrollTextView(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() {@Overridepublic 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() {@Overridepublic 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;}}@Overrideprotected void onFinishInflate() {super.onFinishInflate();fnum = new DecimalFormat("##0.00");}/*** 开始动画*/@Overridepublic void start() {if (!isRunning()) {mPlayingState = RUNNING;if (numberType == 1)runInt();elserunFloat();}}/*** 设置数字** @param number*/@Overridepublic 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;}}/*** 设置数字** @param number*/@Overridepublic 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;}}@Overridepublic void setFromAndEndNumber(int fromNumber, int endNumber) {this.fromNumber = fromNumber;this.number = endNumber;numberType = 1;}@Overridepublic void setFromAndEndNumber(float fromNumber, float endNumber) {this.fromNumber = fromNumber;this.number = endNumber;numberType = 2;}/*** 设置动画时长*/@Overridepublic void setDuration(long duration) {this.duration = duration;}/*** 设置动画结束监听*/@Overridepublic void setOnEndListener(EndListener callback) {mEndListener = callback;}/*** 动画结束接口*/public interface EndListener {/*** 动画结束*/public void onEndFinish();}}

主界面调用

package .numberscrolldemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import .numberscrolldemo.view.NumberScrollTextView;/*** 主界面,数字平滑滚动* created by mashidong*/public class MainActivity extends AppCompatActivity {private NumberScrollTextView tv_number;private Button btn_start;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {tv_number = (NumberScrollTextView) findViewById(R.id.tv_number);tv_number.setFromAndEndNumber(0, 20000);tv_number.setDuration(1000);btn_start = (Button) findViewById(R.id.btn_start);btn_start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {tv_number.start();}});}}

Demo下载

如果不熟悉属性动画,建议参考这篇文章/guolin_blog/article/details/43536355

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。