這個(gè)已經(jīng)是被大家做爛了的效果了坡氯,之所以我自己做這個(gè)效果而不是直接從網(wǎng)上拷貝一個(gè)來(lái)用遂庄,主要是因?yàn)榫W(wǎng)上的工具不太符合我的要求都哭,大部分網(wǎng)友寫(xiě)的工具都不可以帶單位的详民,只是數(shù)字方面的增長(zhǎng)效果田弥,而我的APP中需要帶上單位帚呼,比如公里、升之類(lèi)的皱蹦,與其改人家的源碼不如自己寫(xiě)一個(gè)了煤杀。
先看效果圖:
Android中的動(dòng)畫(huà)
這里用到了屬性動(dòng)畫(huà),Android中的動(dòng)畫(huà)主要分為三大類(lèi)沪哺,分別是視圖動(dòng)畫(huà)和屬性動(dòng)畫(huà)沈自。
視圖動(dòng)畫(huà)分為T(mén)ween Animation(補(bǔ)間動(dòng)畫(huà))和Frame Animation(逐幀動(dòng)畫(huà))
屬性動(dòng)畫(huà)分為ValueAnimator 和 ObjectAnimator;
這里一定要注意一下各種動(dòng)畫(huà)引入時(shí)Android的版本號(hào),否則動(dòng)畫(huà)不會(huì)啟用辜妓,視圖動(dòng)畫(huà)是API Level 1就引入的枯途,所以支持所有Android的版本,而屬性動(dòng)畫(huà)是API Level 11引入的籍滴,即Android 3.0才開(kāi)始有屬性動(dòng)畫(huà)相關(guān)的API,故而在使用屬性動(dòng)畫(huà)時(shí)一定要判斷API的版本酪夷,避免一些不必要的Bug.
實(shí)現(xiàn)思路
整個(gè)思路很簡(jiǎn)單,在使用這個(gè)組件的過(guò)程中有幾個(gè)點(diǎn)是要考慮進(jìn)去的孽惰,第一晚岭,可以是整數(shù)類(lèi)型也可以是浮點(diǎn)型的數(shù)字,所以這里要做標(biāo)識(shí)區(qū)分開(kāi)勋功,第二坦报,可以加入單位(核心需求),第三狂鞋,可以開(kāi)啟是否四舍五入片择,比如需要整數(shù)類(lèi)型的時(shí)候,而傳入的數(shù)字是浮點(diǎn)型骚揍,這時(shí)會(huì)自動(dòng)把傳入的浮點(diǎn)型轉(zhuǎn)化為整數(shù)類(lèi)型字管,這里就要考慮四舍五入的問(wèn)題了。
代碼實(shí)現(xiàn)
下面來(lái)看是如何實(shí)現(xiàn)的
實(shí)現(xiàn)類(lèi):
import android.animation.ValueAnimator;
import android.util.Log;
import android.view.animation.AccelerateInterpolator;
import android.widget.TextView;
/**
* 類(lèi)描述: 創(chuàng)建人:賈真
* 創(chuàng)建時(shí)間:2017/1/23 15:44
*/
public class AutoIncrementUtil {
public static final String FLOATTYPE="FloatType";
public static final String INTTYPE="IntType";
public static void startAnimation(String type,final TextView tvView,float floatValue
,boolean isRoundUp,final String danwei,int duration){
ValueAnimator animator=null;
if(type.equals(FLOATTYPE)){
animator=ValueAnimator.ofFloat(0,floatValue);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float curValue = (float)valueAnimator.getAnimatedValue();
Log.e("curValue ",curValue+"");
tvView.setText(NumUtil.FormatFloat(curValue)+danwei);
}
});
}else if(type.equals(INTTYPE)){
String targetValueString =NumUtil.FormatRoundUp(isRoundUp,floatValue);
animator=ValueAnimator.ofInt(0,Integer.parseInt(targetValueString));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int curValue = (int)valueAnimator.getAnimatedValue();
tvView.setText(curValue+danwei);
}
});
}
animator.setDuration(duration);
animator.setInterpolator(new AccelerateInterpolator());
animator.start();
}
}
數(shù)字轉(zhuǎn)化工具類(lèi):
import java.text.DecimalFormat;
public class NumUtil {
private NumUtil(){
}
public static String FormatFloat(float value){
DecimalFormat df = new DecimalFormat("0.00");
return df.format(value);
}
public static String FormatRoundUp(boolean isRoundUp,float value){
DecimalFormat df;
if(isRoundUp){
df = new DecimalFormat("######0"); //四色五入轉(zhuǎn)換成整數(shù)
return df.format(value);
}else{
Float f= new Float(value);
int i=f.intValue();
return String.valueOf(i);
}
}
}
如何使用:
AutoIncrementUtil.startAnimation(AutoIncrementUtil.INTTYPE,NumView,153261.93f,false,"公里",1500);
應(yīng)該說(shuō)是非常簡(jiǎn)單了,主要用到了屬性動(dòng)畫(huà)的ValueAnimator的兩個(gè)方法嘲叔,ofInt和ofFloat脐供,剩下的都是按部就班的調(diào)用相關(guān)的方法即可,大家稍微閱讀一下源碼就應(yīng)該懂了借跪。