怎么在Android中利用TextView實(shí)現(xiàn)一個(gè)數(shù)字滾動(dòng)動(dòng)畫?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問題。
站在用戶的角度思考問題,與客戶深入溝通,找到?jīng)鲋菥W(wǎng)站設(shè)計(jì)與涼州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋涼州地區(qū)。
NumberRollingView是一個(gè)自定義的自帶數(shù)字滾動(dòng)動(dòng)畫的TextView,通過(guò)使用setContent(String str)方法進(jìn)行數(shù)字字符串設(shè)置,傳入相應(yīng)的金額數(shù)字字符串(如"9686.86")或者整數(shù)數(shù)字字符串(如"968"),設(shè)置的數(shù)字必須是正數(shù)。當(dāng)顯示頁(yè)面初始化完成的過(guò)程中,就可以看到數(shù)字滾動(dòng)的效果了。
1.在attr.xml中配置NumberRollingView的自定義屬性
frameNum:動(dòng)畫的幀數(shù),默認(rèn)為30幀;
textType:內(nèi)容的格式,有money(金額、兩位小數(shù))和num(整數(shù))兩種格式,默認(rèn)為0(金額格式);
useCommaFormat:是否設(shè)置每三位數(shù)字一個(gè)逗號(hào),默認(rèn)為true(設(shè)置逗號(hào)顯示);
runWhenChange:是否當(dāng)內(nèi)容改變的時(shí)候使用動(dòng)畫,反之則不使用動(dòng)畫,默認(rèn)為true(內(nèi)容改變時(shí)使用動(dòng)畫);
2.在XML布局文件中引用View
前者是金額數(shù)字View,后者是整數(shù)數(shù)字View。
3.Java文件中調(diào)用
tvMoney.setContent("9686.86"); tvNum.setContent("9686");
4.取消數(shù)字的自動(dòng)格式化(設(shè)置每三位數(shù)字一個(gè)逗號(hào))
默認(rèn)情況下顯示的數(shù)字經(jīng)過(guò)了格式化處理,設(shè)置每三位數(shù)字添加一個(gè)逗號(hào)分隔,這使得數(shù)字看起來(lái)清晰明了,不會(huì)顯得臃腫繁雜。如果不想將數(shù)字進(jìn)行格式化處理,可以在布局文件中將useCommaFormat屬性設(shè)置為false,或者在代碼中設(shè)置setUseCommaFormat(boolean useCommaFormat)為false,這樣顯示的數(shù)字就不會(huì)是帶有逗號(hào)了。
5.設(shè)置無(wú)論內(nèi)容是否改變都要執(zhí)行滾動(dòng)動(dòng)畫
默認(rèn)情況下NumberRollingView會(huì)自動(dòng)判斷傳入的內(nèi)容是否有變化,當(dāng)內(nèi)容發(fā)生變化時(shí)執(zhí)行數(shù)字滾動(dòng)動(dòng)畫,內(nèi)容未變時(shí)不執(zhí)行數(shù)字滾動(dòng)動(dòng)畫。如果想無(wú)論內(nèi)容是否有變化都要執(zhí)行滾動(dòng)動(dòng)畫的話,可以在布局文件中將runWhenChange屬性設(shè)置為false,或者在代碼中設(shè)置setRunWhenChange(boolean runWhenChange)為false,這樣無(wú)論內(nèi)容是否有變化都會(huì)執(zhí)行滾動(dòng)動(dòng)畫。
6.設(shè)置動(dòng)畫幀數(shù)
默認(rèn)情況下數(shù)字滾動(dòng)動(dòng)畫幀數(shù)為30幀,如果需要修改動(dòng)畫幀數(shù),可根據(jù)實(shí)際需要在在布局文件中將frameNum屬性設(shè)置為自己想要的幀數(shù),或者在代碼中設(shè)置setFrameNum(int frameNum)為自己想要的幀數(shù)即可。
7.數(shù)字字符串格式化(每三位數(shù)字添加一個(gè)逗號(hào))
/** * @param str 字符串只能為兩位小數(shù)或者整數(shù) * @param isDecimal 是否是小數(shù) * @Description 格式化字符串,每三位用逗號(hào)隔開 */ public static String addComma(String str, boolean isDecimal) { //先將字符串顛倒順序 str = new StringBuilder(str).reverse().toString(); if (str.equals("0")) { return str; } String str2 = ""; for (int i = 0; i < str.length(); i++) { if (i * 3 + 3 > str.length()) { str2 += str.substring(i * 3, str.length()); break; } str2 += str.substring(i * 3, i * 3 + 3) + ","; } if (str2.endsWith(",")) { str2 = str2.substring(0, str2.length() - 1); } //最后再將順序反轉(zhuǎn)過(guò)來(lái) String temp = new StringBuilder(str2).reverse().toString(); if (isDecimal) { //去掉最后的"," return temp.substring(0, temp.lastIndexOf(",")) + temp.substring(temp.lastIndexOf(",") + 1, temp.length()); } else { return temp; } }
8.開始金額數(shù)字動(dòng)畫的方法
如果傳入的金額中包含格式化的字符如","或"-"符號(hào),就將符號(hào)去除;將傳入的數(shù)字進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換為Double類型的金額格式,如果發(fā)生轉(zhuǎn)換異常則直接進(jìn)行顯示;同時(shí)判斷傳入的數(shù)字大小,如果為0則直接顯示,若不為0則設(shè)置每幀間隔的大小,發(fā)送Message消息給Handler進(jìn)行內(nèi)容的更新。
/** * @Description 開始金額數(shù)字動(dòng)畫的方法 */ public void startMoneyAnim(String moneyStr) { // 如果傳入的數(shù)字已經(jīng)格式化了,則將包含的符號(hào)去除 String money = moneyStr.replace(",", "").replace("-", ""); try { finalMoneyNum = Double.parseDouble(money); if (finalMoneyNum == 0) { // 如果傳入的數(shù)字為0則直接使用setText()進(jìn)行顯示 NumberRollingView.this.setText(moneyStr); return; } nowMoneyNum = 0; threadPool.execute(new Runnable() { @Override public void run() { Message msg = handler.obtainMessage(); // 將傳入的數(shù)字除以幀數(shù),得到每幀間隔的大小 double size = finalMoneyNum / frameNum; msg.what = MONEY_TYPE; // 如果每幀的間隔小于0.01,則設(shè)置間隔為0.01 msg.obj = size < 0.01 ? 0.01 : size; // 發(fā)送消息改變UI handler.sendMessage(msg); } }); } catch (NumberFormatException e) { e.printStackTrace(); //如果轉(zhuǎn)換Double失敗則直接用setText() NumberRollingView.this.setText(moneyStr); } }
9.開始數(shù)字動(dòng)畫的方法
同上述金額數(shù)字一般,先進(jìn)行格式化符號(hào)去除,然后進(jìn)行類型轉(zhuǎn)換,將其轉(zhuǎn)換為Integer類型的整數(shù)格式,如果發(fā)生轉(zhuǎn)換異常則直接進(jìn)行顯示;為了更加人性化,我們將傳入的數(shù)字與幀數(shù)作了比較,如果數(shù)值小于幀數(shù)就直接顯示,當(dāng)然你想不管數(shù)字大小都能進(jìn)行動(dòng)畫展示,只需將下面的幀數(shù)間隔的獲取稍加改造即可;若大于等于設(shè)置的幀數(shù)則設(shè)置每幀間隔的大小,發(fā)送Message消息給Handler進(jìn)行內(nèi)容的更新。
/** * @Description 開始數(shù)字動(dòng)畫的方法 */ public void startNumAnim(String numStr) { // 如果傳入的數(shù)字已經(jīng)格式化了,則將包含的符號(hào)去除 String num = numStr.replace(",", "").replace("-", ""); try { finalNum = Integer.parseInt(num); if (finalNum < frameNum) { // 如果傳入的數(shù)字比幀數(shù)小,則直接使用setText() NumberRollingView.this.setText(numStr); return; } // 默認(rèn)從0開始動(dòng)畫 nowNum = 0; threadPool.execute(new Runnable() { @Override public void run() { Message msg = handler.obtainMessage(); // 將傳入的數(shù)字除以幀數(shù),得到每幀間隔的大小 int temp = finalNum / frameNum; msg.what = NUM_TYPE; msg.obj = temp; // 發(fā)送消息改變UI handler.sendMessage(msg); } }); } catch (NumberFormatException e) { e.printStackTrace(); //如果轉(zhuǎn)換Integer失敗則直接用setText NumberRollingView.this.setText(numStr); } }
看完上述內(nèi)容,你們掌握怎么在Android中利用TextView實(shí)現(xiàn)一個(gè)數(shù)字滾動(dòng)動(dòng)畫的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!