遇到一個需求,需要展示下面的效果。
需要詞塊只展示兩行,後面加一個收起展開按鈕,但是我們都知道在創建時候,textview是獲取不到寬度的,所以一開始的時候不能直接調用textview.getWidth()方法獲取,那就只能自動動態測量textview的寬度。
/**
* 獲取控件寬度
*
* @param text 字符串
* @param size 字體大小
* @return
*/
public static float getPaintWidth(String text, float size) {
if (null == text || "".equals(text))
return 0;
Paint paint = new Paint();
paint.setTextSize(size);
float text_width = paint.measureText(text);//得到總體長度
return text_width;
}
每個長度都可以測量以後,纔可以開始計算一行展示的個數,返回8,取鏈表前8個進行展示和展開按鈕一起展示即可。
/**
* @Description:獲取顯示兩行時候顯示的數量
* @param historyModels 展示的歷史詞數據
* @return -2:不超過兩行;-1:數據異常 >0:兩行可以顯示的數量
*/
public int getNumber(List<HistoryModel> historyModels) {
if (historyModels!=null && historyModels.size()>0) {
int availableW = SearchUtil.getScreenWidth() - DimenUtils.dip2px(mContext, 10) - DimenUtils.dip2px(mContext, 10); //可展示寬度 = 屏幕寬度 - 左margin - 右margin
int textSize = DimenUtils.sp2px(mContext,12);
int lines = 1;
for (int i = 0, curLineW = 0; i < historyModels.size(); i++) {
HistoryModel model = historyModels.get(i);
String word = model.getHistoryWord();
int dis = (int) getPaintWidth(word,textSize) + DimenUtils.dip2px(mContext, 12) + DimenUtils.dip2px(mContext, 12) + mHorizontalInterval; //控件寬度 = 字體寬度 + 左margin + 右margin + 水平間距
curLineW += dis;
if (curLineW - mHorizontalInterval > availableW) {
lines++;
if (lines == 3) { //當達到第三行的時候,表示當前第i個控件已經在第三行了
if (curLineW - dis + DimenUtils.dip2px(mContext, 29) + mHorizontalInterval > availableW) { //如果當前子控件的前一個控件的當前行寬度是否仍有空間放展開圖標按鈕,如果沒有需要返回當前子控件的上一個控件,否則返回當前子控件位置
return i - 1;
} else {
return i;
}
}
curLineW = dis;
}
}
if (lines<3){
return -2;
}
}
return -1;
}
mHorizontalInterval
:字符串的水平間距
這裏面是將字符串長度進行了限制20個,如果一個字符串太長的話一行展示不下,就會有問題,這裏未做考慮。
當然不同手機適配還是會存在問題,這個就需要自己慢慢調試了。