編輯:關於Android編程
好久沒有寫博客了,最近公司產品剛發布了,終於有一點休閒的時間了,趁這個空閒的時間,今天給大家寫一個數字動畫的效果,可能在以後的時間,或許大家會用的到,值得大家收藏,直接拿過去用就好了。
package com.demo.tools.view; /** * 數字動畫自定義 * * @author zengtao 2015年7月17日 上午11:48:27 * */ public interface RiseNumberBase { public void start(); public RiseNumberTextView withNumber(float number); public RiseNumberTextView withNumber(float number, boolean flag); public RiseNumberTextView withNumber(int number); public RiseNumberTextView setDuration(long duration); public void setOnEnd(RiseNumberTextView.EndListener callback); }
package com.demo.tools.view; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; import com.demo.tools.Utils; /** * 數字動畫自定義 * * @author zengtao 2015年7月17日 上午11:48:03 * */ public class RiseNumberTextView extends TextView implements RiseNumberBase { 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 boolean flags = true; 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); } public RiseNumberTextView(Context context, AttributeSet attr) { super(context, attr); } public RiseNumberTextView(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); } public interface EndListener { public void onEndFinish(); } 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) { if (flags) { setText(Utils.format(,##0.00).format(Double.parseDouble(valueAnimator.getAnimatedValue().toString())) + ); if (valueAnimator.getAnimatedValue().toString().equalsIgnoreCase(number + )) { setText(Utils.format(,##0.00).format(Double.parseDouble(number + ))); } } else { setText(Utils.format(##0.00).format(Double.parseDouble(valueAnimator.getAnimatedValue().toString())) + ); if (valueAnimator.getAnimatedValue().toString().equalsIgnoreCase(number + )) { setText(Utils.format(##0.00).format(Double.parseDouble(number + ))); } } 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(); } @Override public void start() { if (!isRunning()) { mPlayingState = RUNNING; if (numberType == 1) runInt(); else runFloat(); } } @Override public RiseNumberTextView withNumber(float number, boolean flag) { this.number = number; this.flags = flag; numberType = 2; fromNumber = 0; return this; } @Override public RiseNumberTextView withNumber(float number) { System.out.println(number); this.number = number; numberType = 2; fromNumber = 0; return this; } @Override public RiseNumberTextView withNumber(int number) { this.number = number; numberType = 1; fromNumber = 0; return this; } @Override public RiseNumberTextView setDuration(long duration) { this.duration = duration; return this; } @Override public void setOnEnd(EndListener callback) { mEndListener = callback; } }
package com.demo.tools; import java.math.RoundingMode; import java.text.DecimalFormat; /** * 配置文件 * @author zengtao 2015年7月17日 上午11:47:44 * */ public class Utils { /** * 格式化 */ private static DecimalFormat dfs = null; public static DecimalFormat format(String pattern) { if (dfs == null) { dfs = new DecimalFormat(); } dfs.setRoundingMode(RoundingMode.FLOOR); dfs.applyPattern(pattern); return dfs; } }
package com.demo.ui; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.demo.tools.view.RiseNumberTextView; /** * 數字動畫 * * @author zengtao 2015年7月17日 上午11:48:54 * */ public class MainActivity extends Activity { private RiseNumberTextView number1, number2, number3, number4, number5; private Button start; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); initView(); } private void initView() { number1 = (RiseNumberTextView) findViewById(R.id.number1); number2 = (RiseNumberTextView) findViewById(R.id.number2); number3 = (RiseNumberTextView) findViewById(R.id.number3); number4 = (RiseNumberTextView) findViewById(R.id.number4); number5 = (RiseNumberTextView) findViewById(R.id.number5); start = (Button) findViewById(R.id.start); start.setOnClickListener(listener); } OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { if (v == start) { initData(); } } }; private void initData() { number1.withNumber(12.3f).start(); number2.withNumber(16.3f).start(); number3.withNumber(10.3f).start(); number4.withNumber(18.3f).start(); number5.withNumber(17.3f).start(); } }
進程間通信方式在Android開發中我們可以通過Intent、ContentProviders來實現進程間通信,如果不限於Android特有的話,我們還可以使用File、
概述 RecyclerView在安卓開發中非常實用,而且簡單易用,但是在實際開發中一直有一個問題困擾著我,就是定位問題,實際的項目中總是會遇到這樣的需求:檢索Recycl
第一步: 打開手機主菜單,選擇“設置”,然後選擇“無線和網絡”第二步:選擇“虛擬專用網設置&rd
先給大家展示效果圖,看看是大家想要的效果嗎,如果還滿意,請參考以下代碼:前言 UniversalImageLoader是用於加載圖片的一個開源項目,在其項目介紹中是這麼寫