Как найти android TextView количество символов в строке?
Итак, у меня есть TextView в android с шириной всей длины экрана и заполнением провала 5. Как я могу вычислить количество символов, которые будут соответствовать одной строке на экране? Я предполагаю, другими словами, я пытаюсь получить количество столбцов текстового представления?
Я рассматривал ручной расчет в зависимости от текста и ширины, но 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, которая будет напечатана. Однако я считаю, что этот подход очень неэффективен. Есть ли другой подход или лучший алгоритм? Примечание: есть некоторые ошибки в измерении 3, которые я исправил, но был слишком ленив, чтобы редактировать
Ответы
Ответ 1
Попробуй это:
private boolean isTooLarge (TextView text, String newText) {
float textWidth = text.getPaint().measureText(newText);
return (textWidth >= text.getMeasuredWidth ());
}
Определение количества подходящих символов будет невозможно из-за переменной ширины символов. Вышеупомянутая функция проверит, поместится ли конкретная строка в TextView. Содержимое newText должно содержать все символы в определенной строке. Если true, тогда начинайте новую строку (и используя новую строку для передачи в качестве параметра).
Ответ на комментарий:
- потому что приложение может работать во многих системах, именно поэтому вам нужно его измерять.
- Это способ решить ваш "общий вопрос". В чем разница между использованием
str.size()>numCol
и слишком большой? Вам нужно будет реализовать анимацию (подсказка № 1: вставить символ новой строки) - Как я уже говорил, когда вы начинаете новую строку, вы начинаете новую строку (подсказка № 2: если вы расширяете TextView, вы можете реализовать все это в переопределении
setText
). (подсказка № 3: Следите за строками, созданными с помощью static int lines;
и используйте newString.split("\\r?\\n")[lines-1]
для проверки длины).
Ответ 2
Вы можете получить общую строку Textview и получить строку для каждого символа, используя следующий код. Затем вы можете установить стиль для каждой строки, в зависимости от того, что вы хотите.
Я установил первую строку жирным шрифтом.
private void setLayoutListner( final TextView textView ) {
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
final Layout layout = textView.getLayout();
// Loop over all the lines and do whatever you need with
// the width of the line
for (int i = 0; i < layout.getLineCount(); i++) {
int end = layout.getLineEnd(0);
SpannableString content = new SpannableString( textView.getText().toString() );
content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0);
content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0);
textView.setText( content );
}
}
});
}
Попробуйте так. Вы можете применить несколько стилей таким образом.