84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
认证高级PHP讲师
假設TextView的寬度是在xml內設定的具體數值,例如300dp, (目的是為了簡化這個問題,如果設定為match_parent或wrap_content,需要在程式執行時計算其寬度,而直接getWidth總是返回0,比較麻煩。
<TextView android:id="@+id/textView" android:layout_width="300dp" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" />
String str = "If you really want to hear about it, the first thing you'll probably want to know";
If you really want to hear about it, the first thin...
關鍵是如何計算每一個字元的寬度。 然後遍歷這個字串,當前n個字元寬度總和,超過TextView寬度時,就得到了已顯示的字元個數。
String str = "If you really want to hear about it, the first thing you'll probably want to know"; mTextView = (TextView) findViewById(R.id.textView); // 计算TextView宽度:xml中定义的宽度300dp,转换成px float textViewWidth = convertDpToPixel(300); float dotWidth = getCharWidth(mTextView, '.'); Log.d(TAG, "TextView width " + textViewWidth); int sumWidth = 0; for (int index=0; index<str.length(); index++) { // 计算每一个字符的宽度 char c = str.charAt(index); float charWidth = getCharWidth(mTextView, c); sumWidth += charWidth; Log.d(TAG, "#" + index + ": " + c + ", width=" + charWidth + ", sum=" + sumWidth); if (sumWidth + dotWidth*3 >= textViewWidth) { Log.d(TAG, "TextView shows #" + index + " char: " + str.substring(0, index)); break; } } // Dp转Px private float convertDpToPixel(float dp){ Resources resources = getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return px; } // 计算每一个字符的宽度 public float getCharWidth(TextView textView, char c) { textView.setText(String.valueOf(c)); textView.measure(0, 0); return textView.getMeasuredWidth(); }
在榮耀3C和LG G3上測試通過(G3比計算的結果,多顯示了一個字符):
10-22 01:17:42.046: D/Text(21495): TextView width 600.0 10-22 01:17:42.048: D/Text(21495): #0: I, width=8.0, sum=8 10-22 01:17:42.049: D/Text(21495): #1: f, width=9.0, sum=17 10-22 01:17:42.049: D/Text(21495): #2: , width=7.0, sum=24 10-22 01:17:42.049: D/Text(21495): #3: y, width=14.0, sum=38 ...... 10-22 01:17:42.053: D/Text(21495): #17: t, width=9.0, sum=213 10-22 01:17:42.053: D/Text(21495): #18: , width=7.0, sum=220 10-22 01:17:42.053: D/Text(21495): #19: t, width=9.0, sum=229 ...... 10-22 01:17:42.061: D/Text(21495): #50: n, width=16.0, sum=575 10-22 01:17:42.061: D/Text(21495): #51: g, width=16.0, sum=591 10-22 01:17:42.061: D/Text(21495): TextView shows #51 char: If you really want to hear about it, the first thin
假設TextView的寬度是在xml內設定的具體數值,例如300dp,
例如是這樣配置的:(目的是為了簡化這個問題,如果設定為match_parent或wrap_content,需要在程式執行時計算其寬度,而直接getWidth總是返回0,比較麻煩。
所以,如果你想得到已顯示的字元數,或未顯示的字元數,那麼其中的If you really want to hear about it, the first thin...
關鍵是如何計算每一個字元的寬度。 然後遍歷這個字串,當前n個字元寬度總和,超過TextView寬度時,就得到了已顯示的字元個數。
結果如下,在榮耀3C和LG G3上測試通過(G3比計算的結果,多顯示了一個字符):
就是這樣。