溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Android中利用TextView實現(xiàn)一個數(shù)字滾動動畫

發(fā)布時間:2020-12-04 16:22:50 來源:億速云 閱讀:1062 作者:Leah 欄目:移動開發(fā)

怎么在Android中利用TextView實現(xiàn)一個數(shù)字滾動動畫?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

NumberRollingView是一個自定義的自帶數(shù)字滾動動畫的TextView,通過使用setContent(String str)方法進(jìn)行數(shù)字字符串設(shè)置,傳入相應(yīng)的金額數(shù)字字符串(如"9686.86")或者整數(shù)數(shù)字字符串(如"968"),設(shè)置的數(shù)字必須是正數(shù)。當(dāng)顯示頁面初始化完成的過程中,就可以看到數(shù)字滾動的效果了。

1.在attr.xml中配置NumberRollingView的自定義屬性

<declare-styleable name="NumberRollingView">
  <!--幀數(shù)-->
  <attr name="frameNum" format="integer"></attr>
  <!--內(nèi)容的格式-->
  <attr name="textType">
    <enum name="money" value="0"></enum>
    <enum name="num" value="1"></enum>
  </attr>
  <!--是否設(shè)置每三位數(shù)字一個逗號-->
  <attr name="useCommaFormat" format="boolean"></attr>
  <!--是否當(dāng)內(nèi)容改變的時候使用動畫,反之則不使用動畫-->
  <attr name="runWhenChange" format="boolean"></attr>
</declare-styleable>

frameNum:動畫的幀數(shù),默認(rèn)為30幀;
textType:內(nèi)容的格式,有money(金額、兩位小數(shù))和num(整數(shù))兩種格式,默認(rèn)為0(金額格式);
useCommaFormat:是否設(shè)置每三位數(shù)字一個逗號,默認(rèn)為true(設(shè)置逗號顯示);
runWhenChange:是否當(dāng)內(nèi)容改變的時候使用動畫,反之則不使用動畫,默認(rèn)為true(內(nèi)容改變時使用動畫);

2.在XML布局文件中引用View

<com.wiggins.digitalchange.widget.NumberRollingView
  android:id="@+id/tv_money"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="0.00"
  android:textColor="@color/white"
  android:textSize="@dimen/font_max"
  android:textStyle="bold" />

<com.wiggins.digitalchange.widget.NumberRollingView
  android:id="@+id/tv_num"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="0"
  android:textColor="@color/white"
  android:textSize="@dimen/font_max"
  android:textStyle="bold"
  app:textType="num" />

前者是金額數(shù)字View,后者是整數(shù)數(shù)字View。

3.Java文件中調(diào)用

tvMoney.setContent("9686.86");
tvNum.setContent("9686");

4.取消數(shù)字的自動格式化(設(shè)置每三位數(shù)字一個逗號)

默認(rèn)情況下顯示的數(shù)字經(jīng)過了格式化處理,設(shè)置每三位數(shù)字添加一個逗號分隔,這使得數(shù)字看起來清晰明了,不會顯得臃腫繁雜。如果不想將數(shù)字進(jìn)行格式化處理,可以在布局文件中將useCommaFormat屬性設(shè)置為false,或者在代碼中設(shè)置setUseCommaFormat(boolean useCommaFormat)為false,這樣顯示的數(shù)字就不會是帶有逗號了。

5.設(shè)置無論內(nèi)容是否改變都要執(zhí)行滾動動畫

默認(rèn)情況下NumberRollingView會自動判斷傳入的內(nèi)容是否有變化,當(dāng)內(nèi)容發(fā)生變化時執(zhí)行數(shù)字滾動動畫,內(nèi)容未變時不執(zhí)行數(shù)字滾動動畫。如果想無論內(nèi)容是否有變化都要執(zhí)行滾動動畫的話,可以在布局文件中將runWhenChange屬性設(shè)置為false,或者在代碼中設(shè)置setRunWhenChange(boolean runWhenChange)為false,這樣無論內(nèi)容是否有變化都會執(zhí)行滾動動畫。

6.設(shè)置動畫幀數(shù)

默認(rèn)情況下數(shù)字滾動動畫幀數(shù)為30幀,如果需要修改動畫幀數(shù),可根據(jù)實際需要在在布局文件中將frameNum屬性設(shè)置為自己想要的幀數(shù),或者在代碼中設(shè)置setFrameNum(int frameNum)為自己想要的幀數(shù)即可。

7.數(shù)字字符串格式化(每三位數(shù)字添加一個逗號)

/**
 * @param str    字符串只能為兩位小數(shù)或者整數(shù)
 * @param isDecimal 是否是小數(shù)
 * @Description 格式化字符串,每三位用逗號隔開
 */
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)過來
  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ù)字動畫的方法

如果傳入的金額中包含格式化的字符如","或"-"符號,就將符號去除;將傳入的數(shù)字進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換為Double類型的金額格式,如果發(fā)生轉(zhuǎn)換異常則直接進(jìn)行顯示;同時判斷傳入的數(shù)字大小,如果為0則直接顯示,若不為0則設(shè)置每幀間隔的大小,發(fā)送Message消息給Handler進(jìn)行內(nèi)容的更新。

/**
 * @Description 開始金額數(shù)字動畫的方法
 */
public void startMoneyAnim(String moneyStr) {
  // 如果傳入的數(shù)字已經(jīng)格式化了,則將包含的符號去除
  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 &#63; 0.01 : size;
        // 發(fā)送消息改變UI
        handler.sendMessage(msg);
      }
    });
  } catch (NumberFormatException e) {
    e.printStackTrace();
    //如果轉(zhuǎn)換Double失敗則直接用setText()
    NumberRollingView.this.setText(moneyStr);
  }
}

9.開始數(shù)字動畫的方法

同上述金額數(shù)字一般,先進(jìn)行格式化符號去除,然后進(jìn)行類型轉(zhuǎn)換,將其轉(zhuǎn)換為Integer類型的整數(shù)格式,如果發(fā)生轉(zhuǎn)換異常則直接進(jìn)行顯示;為了更加人性化,我們將傳入的數(shù)字與幀數(shù)作了比較,如果數(shù)值小于幀數(shù)就直接顯示,當(dāng)然你想不管數(shù)字大小都能進(jìn)行動畫展示,只需將下面的幀數(shù)間隔的獲取稍加改造即可;若大于等于設(shè)置的幀數(shù)則設(shè)置每幀間隔的大小,發(fā)送Message消息給Handler進(jìn)行內(nèi)容的更新。

/**
 * @Description 開始數(shù)字動畫的方法
 */
public void startNumAnim(String numStr) {
  // 如果傳入的數(shù)字已經(jīng)格式化了,則將包含的符號去除
  String num = numStr.replace(",", "").replace("-", "");
  try {
    finalNum = Integer.parseInt(num);
    if (finalNum < frameNum) {
      // 如果傳入的數(shù)字比幀數(shù)小,則直接使用setText()
      NumberRollingView.this.setText(numStr);
      return;
    }
    // 默認(rèn)從0開始動畫
    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實現(xiàn)一個數(shù)字滾動動畫的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI