最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android如何獲取textview最多顯示

 更新時(shí)間:2021年06月02日 10:35:33   作者:一葉飄舟Finder  
今天在公司遇到一個(gè)需求;TextView設(shè)置最多顯示8個(gè)字符,超過部分顯示...(省略號),那么android如何獲取textview最多顯示,感興趣的可以了解一下

方法一

工作中用的一個(gè)方法,雖然不算特別準(zhǔn)確,但效果還是不錯(cuò)的,這里分享下。

    /**
     * 獲取textview最大能顯示幾個(gè)字
     * @param text 文本內(nèi)容
     * @param size 文本字體大小
     * @param maxWidth textview的最大寬度
     * @return
     */
    private float getLineMaxNumber(String text, float size,float maxWidth) {
        if (null == text || "".equals(text)){
            return 0;
        }
        Paint paint = new Paint();
        paint.setTextSize(size);
        //得到文本內(nèi)容總體長度
        float textWidth = paint.measureText(text);
        // textWidth
        float width = textWidth / text.length();
        float total = maxWidth / width;
        return total;
    }

上面這個(gè)方法不太精確,不過比較適合在 RecyclerView 或 ListView 里面使用,避免生成太多對象

方法二

/**
     * 獲取textview一行最大能顯示幾個(gè)字(需要在TextView測量完成之后)
     *
     * @param text     文本內(nèi)容
     * @param paint    textview.getPaint()
     * @param maxWidth textview.getMaxWidth()/或者是指定的數(shù)值,如200dp
     */
    private int getLineMaxNumber(String text, TextPaint paint, int maxWidth) {
        if (null == text || "".equals(text)) {
            return 0;
        }
        StaticLayout staticLayout = new StaticLayout(text, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL
                , 1.0f, 0, false);
        //獲取第一行最后顯示的字符下標(biāo)
        return staticLayout.getLineEnd(0);
    }

利用 StaticLayout 可以非常輕松的得到一行可以顯示的最大字符數(shù)

延伸:
對于一個(gè)單行 TextView,當(dāng)字符串超出一行時(shí),如何獲取未顯示的部分字符串?
textview 設(shè)定最大行數(shù)為 1 后,文本超出了 textview,textView 末尾顯示省略號,我就想知道省略號代表的內(nèi)容
思路:
假設(shè) TextView 的寬度是在 xml 內(nèi)設(shè)置的具體數(shù)值,比如 300dp,
(目的是為了簡化這個(gè)問題,如果設(shè)置為 match_parent 或者 wrap_content,需要在程序運(yùn)行時(shí)計(jì)算其寬度,而直接 getWidth 總是返回 0,比較麻煩。)
比如是這樣配置的:

  <TextView
        android:id="@+id/textView"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true" />

然后填充了一個(gè)超長的字符串,比如這樣:

String str = "If you really want to hear about it, the first thing you'll probably want to know";
這樣就會導(dǎo)致顯示不全,像這樣:
If you really want to hear about it, the first thin...

所以,如果你想得到已顯示的字符個(gè)數(shù),或者未顯示的字符個(gè)數(shù),那么其中的關(guān)鍵是如何計(jì)算每一個(gè)字符的寬度。
然后遍歷這個(gè)字符串,當(dāng)前n個(gè)字符寬度總和,超過TextView寬度時(shí),就得到了已顯示的字符個(gè)數(shù)。

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);

// 計(jì)算TextView寬度:xml中定義的寬度300dp,轉(zhuǎn)換成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++) {
    // 計(jì)算每一個(gè)字符的寬度
    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轉(zhuǎn)Px
private float convertDpToPixel(float dp){
    Resources resources = getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return px;
}

// 計(jì)算每一個(gè)字符的寬度
public float getCharWidth(TextView textView, char c) {
    textView.setText(String.valueOf(c));
    textView.measure(0, 0);
    return textView.getMeasuredWidth();
} 

結(jié)果如下,在榮耀 3C 和 LG G3 上測試通過(G3 比計(jì)算的結(jié)果,多顯示了一個(gè)字符):

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

到此這篇關(guān)于android獲取textview最多顯示的文章就介紹到這了,更多相關(guān)android textview最多顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評論

临高县| 镇宁| 新巴尔虎左旗| 囊谦县| 革吉县| 阳城县| 铜陵市| 平罗县| 石屏县| 沧源| 赤峰市| 锡林郭勒盟| 锦屏县| 灌云县| 祥云县| 新和县| 德令哈市| 景宁| 邯郸县| 普格县| 临城县| 揭西县| 永平县| 石楼县| 丁青县| 徐水县| 汤阴县| 澎湖县| 洛阳市| 五常市| 金坛市| 平度市| 西畴县| 灵丘县| 郯城县| 萨嘎县| 凤凰县| 温宿县| 剑川县| 株洲县| 扎鲁特旗|