Итак, у меня есть 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, которые я исправил, но был слишком ленив, чтобы редактировать
