遇到一个需求,需要展示下面的效果。
需要词块只展示两行,后面加一个收起展开按钮,但是我们都知道在创建时候,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个,如果一个字符串太长的话一行展示不下,就会有问题,这里未做考虑。
当然不同手机适配还是会存在问题,这个就需要自己慢慢调试了。