android如何獲取textview最多顯示
方法一
工作中用的一個方法,雖然不算特別準確,但效果還是不錯的,這里分享下。
/**
* 獲取textview最大能顯示幾個字
* @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;
}
上面這個方法不太精確,不過比較適合在 RecyclerView 或 ListView 里面使用,避免生成太多對象
方法二
/**
* 獲取textview一行最大能顯示幾個字(需要在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);
//獲取第一行最后顯示的字符下標
return staticLayout.getLineEnd(0);
}
利用 StaticLayout 可以非常輕松的得到一行可以顯示的最大字符數(shù)
延伸:
對于一個單行 TextView,當字符串超出一行時,如何獲取未顯示的部分字符串?
textview 設(shè)定最大行數(shù)為 1 后,文本超出了 textview,textView 末尾顯示省略號,我就想知道省略號代表的內(nèi)容
思路:
假設(shè) TextView 的寬度是在 xml 內(nèi)設(shè)置的具體數(shù)值,比如 300dp,
(目的是為了簡化這個問題,如果設(shè)置為 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";
這樣就會導(dǎo)致顯示不全,像這樣:
If you really want to hear about it, the first thin...
所以,如果你想得到已顯示的字符個數(shù),或者未顯示的字符個數(shù),那么其中的關(guān)鍵是如何計算每一個字符的寬度。
然后遍歷這個字符串,當前n個字符寬度總和,超過TextView寬度時,就得到了已顯示的字符個數(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);
// 計算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++) {
// 計算每一個字符的寬度
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;
}
// 計算每一個字符的寬度
public float getCharWidth(TextView textView, char c) {
textView.setText(String.valueOf(c));
textView.measure(0, 0);
return textView.getMeasuredWidth();
}
結(jié)果如下,在榮耀 3C 和 LG G3 上測試通過(G3 比計算的結(jié)果,多顯示了一個字符):
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)文章
Android開發(fā)之獲取網(wǎng)絡(luò)鏈接狀態(tài)
這篇文章主要介紹了Android獲取網(wǎng)絡(luò)鏈接狀態(tài)的方法,主要是通過ConnectivityManager類來完成的,需要的朋友可以參考下2014-08-08
Android用Scroller實現(xiàn)一個可向上滑動的底部導(dǎo)航欄
本篇文章主要介紹了Android用Scroller實現(xiàn)一個可上滑的底部導(dǎo)航欄,具有一定的參考價值,有興趣的小伙伴們可以參考一下2017-07-07
解析離線安裝Eclipse的Android ADT開發(fā)插件的具體操作(圖文)
本篇文章是對離線安裝Eclipse的Android ADT開發(fā)插件的具體操作進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Android?adb?shell?dumpsys?audio?信息查看分析詳解
文章詳細介紹了如何使用dumpsysaudio命令查看和分析Android設(shè)備的音頻信息,包括音頻流狀態(tài)、音量、外設(shè)連接情況等,文章還提供了示例日志分析和源碼鏈接,幫助開發(fā)者更好地理解和調(diào)試Android音頻系統(tǒng)2024-11-11

