当时使用流式布局写搜索历史,如果输入文字过长会导致重叠堆积。最开始的解决思路是:计算屏幕宽度下,一行最多可以显示多少个字,然后设置下。但后来并没有采用这个方案,而是固定宽度,中间使用省略号。文章可见:
现在有时间回顾代码,就把最开始的思路整理下(准确地讲,当时只限于思路,找了些文章看,但没有实施)。
参考文献:
https://blog.csdn.net/u010661782/article/details/52805939
https://blog.csdn.net/ZoNE17/article/details/39967439
简单点,直接上代码,解析的部分第一篇参考文献可以借鉴。
lenTv = findViewById(R.id.cal_text_len);
String str = "测试长度";
lenTv.setText(str);
Log.e("crsh","屏幕宽度:" + Utils.getScreenWidth(mContext));
Log.e("crsh","TextView视图的宽度:" + lenTv.getWidth());
TextPaint tp = new TextPaint();
tp.setTextSize(14);
Log.e("crsh","TextPaint测量得出的宽度:" + tp.measureText(str));
tp.measureText(str);
Rect rect = new Rect();
tp.getTextBounds(str,0,str.length(),rect);
Log.e("crsh","TextPaint测量TextBounds的宽度:" + rect.width());
int strCount = (int)(Utils.getScreenWidth(mContext) / (rect.width() / str.length()));
Log.e("crsh","strCount = " + strCount);
String oneStr = "测";
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < strCount; i++) {
stringBuffer.append(oneStr);
}
lenTv.setText(stringBuffer.toString());
打印Log结果:
01-08 16:22:01.913 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: 屏幕宽度:360
01-08 16:22:01.913 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextView视图的宽度:0
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextPaint测量得出的宽度:56.0
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextPaint测量TextBounds的宽度:56
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: strCount = 25
代码涉及到的工具类实现:
public static int getScreenWidth(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int width = (int)(displayMetrics.widthPixels / displayMetrics.density);
return width;
}
public static int getScreenHeight(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return displayMetrics.heightPixels;
}
上述代码有一处是有必要解释下的。
两点:
一、获取屏幕宽度的方法有两类:getResources()和WindowManager 。但最终都是得到DisplayMetrics类的对象或是Display类的对象。
二、计算个数时需要使用dp而非px。所以我对求宽度的工具类的代码做了调整,而求高度的代码没有动。两个对比可知,如果想返回px应该怎么用;如果想返回dp应该怎么用。
结束!?
问题:这个中文的,如果文字包含英文或数字,则会出现问题。解决:
过滤掉中文汉字,剩下的字符除以2,这样的操作使用一个汉字的宽度占两个字符,所以两个英文或是数字字符的宽度等于一个汉字宽。问题转化为:计算汉字个数。可百度众多实现,下面直接贴实现代码:
//过滤中英文 //计算汉字个数
String regEx = "[\\u4e00-\\u9fa5]"; //中文的Unicode编码范围
String allChar = str.replaceAll(regEx, "aa");
int count = allChar.length()-str.length();
float tempLen = (str.length() - count) / 2 + count; //除却中文的字符数,除以2
int strCount = (int)(Utils.getScreenWidth(mContext) / (rect.width() / tempLen));
OK了吧?应该是的。