android - 对于一个单行TextView,当字符串超出一行时,如何获取未显示的部分字符串?
PHP中文网
PHP中文网 2017-04-17 14:34:53
0
1
404
PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(1)
大家讲道理

假設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
就是這樣。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!