詳解Android TextView屬性ellipsize多行失效的解決思路
本文介紹了Android TextView屬性ellipsize多行失效的解決思路,分享給大家,具體如下:
多余文字顯示省略號(hào)的常規(guī)做法
android:ellipsize="end" //省略號(hào)顯示在末尾
android:ellipsize="middle" //省略號(hào)顯示在中間
但是設(shè)置android:maxLines="2" 以后,ellipsize的值end有效,middle無效,本方法解決middle無效的問題
/**
* 字符串顯示到textView, textView maxLines=2
* 如果字符串太長(zhǎng)顯示不下,則用省略號(hào)代替
* 省略號(hào)的位置在第一行末尾
*
* @param textView 顯示字符串的view
* @param str 要顯示的字符串
* @param width 顯示字符串的view的寬
* @return 處理后帶省略號(hào)的字符串
*/
private String ellipsizeString(TextView textView, String str, int width) {
Paint paint = textView.getPaint();
//文字總寬小于2倍的view寬,說明小于2行,直接返回
if (paint.measureText(str) < 2 * width) {
return str;
}
//存儲(chǔ)顯示到view的每行文字
List<String> list = new ArrayList<>();
int len = 0;
int start, end = 0;
while (len < str.length()) {
len += end;
int count = paint.breakText(str, end, str.length(), true, width, null);
start = end;
end = end + count;
list.add(str.substring(start, end));
}
//第一行文字末尾三個(gè)字符替換成省略號(hào)
String line1 = list.get(0);
line1 = line1.substring(0, line1.length() - 3) + "...";
//最后一行半的文字從末尾向前截取一行文字
String endLine = list.get(list.size() - 1);
int endLineWidth = (int) paint.measureText(endLine);
String minorEndLine = list.get(list.size() - 2);
int minorCuteCount = paint.breakText(minorEndLine, 0, minorEndLine.length(), true, endLineWidth, null);
String line2 = minorEndLine.substring(minorCuteCount, minorEndLine.length()) + endLine;
return line1 + line2;
}
代碼的核心方法
paint.measureText(str) //測(cè)量字符串的寬度 paint.breakText(str, end, str.length(), true, width, null); //計(jì)算指定寬度下顯示的字符串?dāng)?shù)量
都是api的方法,詳細(xì)見源碼
需要完善的地方,android設(shè)備的不同字符顯示的寬度不同,三個(gè)字母替比省略號(hào)三個(gè)點(diǎn)要寬,m字符比l字符占位要寬,所以上面的方法處理后的字符串并不能使省略號(hào)顯示到第一行末尾,有需要的可以在替換省略號(hào)那行代碼那里精確處理一下,思路可以用上面的兩個(gè)核心方法做一系列判斷。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)清除單個(gè)域名的cookie
這篇文章主要介紹了Android實(shí)現(xiàn)清除單個(gè)域名的cookie,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
android ListView自動(dòng)滾動(dòng)方法
直接在Layout中寫即可,注意下面的stackFromBottom以及transcriptMode這兩個(gè)屬性2013-01-01
關(guān)于Android多渠道打包的進(jìn)階知識(shí)
前一篇文章主要介紹了關(guān)于Android程序的多渠道打包方法,這一篇文章介紹了多渠道打包的進(jìn)階知識(shí),還不會(huì)的同學(xué)快進(jìn)來學(xué)習(xí)下吧,建議收藏以防迷路2021-08-08
android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法
這篇文章主要為大家詳細(xì)介紹了android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Gradle?Build?Cache引發(fā)的Task緩存編譯問題
這篇文章主要為大家介紹了Gradle?Build?Cache引發(fā)的Task緩存編譯問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android入門之實(shí)現(xiàn)手工發(fā)送一個(gè)BroadCast
這篇文章主要通過手工來發(fā)送一條BroadCast進(jìn)一步來帶大家深入了解BroadCast,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Android有一定幫助,感興趣的可以收藏一下2022-12-12
Android自定義DigitalClock控件實(shí)現(xiàn)商品倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Android DigitalClock實(shí)現(xiàn)商品倒計(jì)時(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

