在Android中,我有一个TextView,它的宽度与屏幕长度相同,内边距为dip 5。如何计算在屏幕上适合单行的字符数?换句话说,我想知道textview的列数是多少?
我考虑手动计算,取决于文本大小和宽度,但1)我不知道它们之间的相关性,2)由于dip单位的填充,不同的屏幕将使用不同数量的实际像素来填充。
总体问题:我试图解决这个问题:如果给定一个字符串,如何手动编辑字符串,以便当textview逐个字符打印字符串时,我将知道何时开始一个不适合一行的单词。请注意:我知道textview会自动将不适合的单词放到下一行,但是由于我正在逐个字符地打印,就像输入动画一样,textview在打印出该单词的溢出字符之前不知道该单词不适合。
已经到处搜索了这个问题...
谢谢!
添加的解决方案:
一个可能的解决方案:
解决方案2,但有时仍然使用解决方案1。
我考虑手动计算,取决于文本大小和宽度,但1)我不知道它们之间的相关性,2)由于dip单位的填充,不同的屏幕将使用不同数量的实际像素来填充。
总体问题:我试图解决这个问题:如果给定一个字符串,如何手动编辑字符串,以便当textview逐个字符打印字符串时,我将知道何时开始一个不适合一行的单词。请注意:我知道textview会自动将不适合的单词放到下一行,但是由于我正在逐个字符地打印,就像输入动画一样,textview在打印出该单词的溢出字符之前不知道该单词不适合。
已经到处搜索了这个问题...
谢谢!
添加的解决方案:
一个可能的解决方案:
public String measure2 (TextView t, String s) {
String u = "";
int start = 0;
int end = 1;
int space = 0;
boolean ellipsized = false;
float fwidth = t.getMeasuredWidth();
for(;;) {
//t.setText(s.substring(start, end));
float twidth = t.getPaint().measureText(s.substring(start, end));
if (twidth < fwidth){
if (end < s.length())
end++;
else {
if (!ellipsized)
return s;
return u + s.subSequence(start, end);
}
}
else {
ellipsized = true;
space = (u + s.substring(start, end)).lastIndexOf(" ");
if (space == -1)
space = end - 1;
u += s.subSequence(start, space) + "\n";
start = space + 1;
end = start + 1;
}
}
}
解决方案2,但有时仍然使用解决方案1。
public String measure3 (TextView t, String s) {
List<String> wlist = Arrays.asList(s.split(" "));
if (wlist.size() == 1)
return measure2(t, s);
String u = "";
int end = 1;
float fwidth = t.getMeasuredWidth();
for(;;) {
//t.setText(s.substring(start, end));
if (wlist.isEmpty())
return u;
String temp = listStr(wlist, end);
float twidth = t.getPaint().measureText(temp);
if (twidth < fwidth){
if (end < wlist.size())
end++;
else {
return u + temp;
}
}
else {
temp = listStr(wlist, end-1);
if (end == 1)
temp = measure2(t, temp);
if (wlist.isEmpty())
return u + temp;
else
u = u + temp + "\n";
wlist = wlist.subList(end - 1, wlist.size());
end = 1;
}
}
}
public String listStr (List<String> arr, int end) {
String s = "";
for (String e : arr.subList(0, end) ){
s = s + e + " ";
}
return s.trim();
}
我使用了上面的代码来生成一个原始字符串s,然后生成一个将被打印出来的字符串u。但是,我认为这种方法非常低效。是否有另一种方法或更好的算法?注意:measure3中有一些错误,但我懒得编辑。