Итак, у меня есть TextView в Android, который имеет ширину во всю длину экрана и отступ 5. Как я могу рассчитать количество символов, которые будут соответствовать одной строке на экране? Я думаю, другими словами, я пытаюсь получить количество столбцов textview?
Я рассмотрел ручной расчет в зависимости от размера и ширины текста, но 1) не знаю корреляции и 2) из-за заполнения в единицах наклона разные экраны будут использовать разное количество фактических пикселей для заполнения.
Общий вопрос: я пытаюсь использовать это для решения: если дана строка, как я могу вручную отредактировать строку, чтобы, когда текстовое представление печатало строку символ за символом, я знал, когда начинать слово, которое не подходит для одного строка на след. Примечание. Я знаю, что 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, которые я исправил, но было лень редактировать