【发布时间】:2011-08-23 15:51:12
【问题描述】:
所以我在 android 中有一个 TextView,其宽度与屏幕的整个长度相同,并且填充为 dip 5。如何计算适合屏幕上单行的字符数?我想换句话说,我正在尝试获取 textview 的列数?
我考虑过根据文本大小和宽度手动计算,但 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 有一些错误我已经修复了,但是懒得编辑了
【问题讨论】:
-
我不认为默认字体是固定宽度的。因此,例如,它适合的 Ms 比 Is 少。如果您包含固定宽度的字体,那么找出的一种方法是继续添加到字符串并将其设置为视图,然后在屏幕上手动计算它们。它也会因不同的屏幕而有所不同,但这可能会导致您的使用出现问题。
-
@Derek 你能更新 measure3 函数吗?我想使用这个解决方案。谢谢
-
@Derek 最后我得到了解决方案,你也应该试试这个stackoverflow.com/a/56753731/6676310
标签: android text size width textview