Android數字跳動的TextView實現

VirGreco 7年前發布 | 16K 次閱讀 TextView Android開發 移動開發

簡介

DancingNumberView是一個用于跳動顯示文本中數字的控件,繼承自TextView.這種控件一般用于顯示金額等對用戶較為敏感的數字,讓UI交互更加生動。

它具有以下幾點特性:

  • 自動獲取文本中的所有數字,并同時開始跳動,免去多個TextView拼接的麻煩
  • 支持數字按照自定義的格式顯示,例如限定只顯示小數點后兩位

效果預覽

導入使用

Gradle

第1步,在project的build.gradle文件中適當位置添加

allprojects { 
    repositories { 
        ... 
        maven { url "https://jitpack.io" } 
    } 
}  

第2步,在app的build.gradle文件中適當位置添加依賴項

dependencies { 
       compile 'com.github.JianxunRao:DancingNumberView:V1.0.1' 
}  

使用方式

通過XML布局

<me.trojx.dancingnumber.DancingNumberView 
            android:id="@+id/dnv" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            app:dnv_duration="6000" 
            app:dnv_format="%.2f"/>  

通過Java代碼

DancingNumberView dnv = (DancingNumberView) findViewById(R.id.dnv); 
   dnv.setText(text);//設置顯示內容 
   dnv.setDuration(duration);//設置完成跳動的持續時長(單位ms) 
   dnv.setFormat(format);//設置數字的顯示格式 
   dnv.dance();//啟動效果,開始數字跳動  

關鍵代碼

/**  
* 文本中的數字開始跳動 
 
*/ 
 
public void dance() { 
 
text = getText().toString(); 
 
numbers=new ArrayList<>(); 
 
Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?"); 
 
Matcher matcher=pattern.matcher(text); 
 
while (matcher.find()){ 
 
numbers.add(Float.parseFloat(matcher.group())); 
 
} 
 
textPattern = text.replaceAll("\\d+(\\.\\d+)?",PLACEHOLDER); 
 
numberTemp=new float[numbers.size()]; 
 
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(this,"factor",0,1); 
 
objectAnimator.setDuration(duration); 
 
objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); 
 
objectAnimator.start(); 
 
} 
 
/** 
 
* 獲取算數因子 
 
* @return 算數因子 
 
*/ 
 
public float getFactor() { 
 
return factor; 
 
} 
 
/** 
 
* 設置算數因子,為ObjectAnimator調用 
 
* @see ObjectAnimator 
 
* @param factor 算數因子 
 
*/ 
 
public void setFactor(float factor) { 
 
String textNow=textPattern; 
 
this.factor = factor; 
 
for (int i=0;i<numberTemp.length;i++){ 
 
numberTemp[i]=numbers.get(i)*factor; 
 
textNow=textNow.replaceFirst(PLACEHOLDER,String.format(format,numberTemp[i])); 
 
} 
 
setText(textNow); 
 
}  

 

來自:http://mobile.51cto.com/android-537571.htm

 

 本文由用戶 VirGreco 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!