Как заставить Paint.breakText уважать перенос слов? - PullRequest
1 голос
/ 09 июля 2019

Я хочу подсчитать, сколько строк нужно разместить в некотором тексте с фиксированной шириной TextView. И я использовал Paint.breakText для этого:

int maxWidth = WIDTH_IN_PIXELS;
int index = 0;
int linecnt = 0;
while (true) {
    float[] measuredWidth = new float[1];
    int advances = labelView.getPaint().breakText(text, index, text.length(), true,  maxWidth, measuredWidth);
    linecnt += 1;
    index += advances;
    if(index>=desc.length()) break;           
}

Однако, рассчитанное linecnt всегда на единицу меньше, чем действительно необходимо. После дальнейшего изучения я обнаружил, что API разбивает текст в произвольных точках в словах, но когда текст макета TextView, он никогда не разбивает слово:

// textBreak:
Hello Wo
rld
// Real layout:
Hello
World

Как мне заставить breakText соблюдать перенос слов? Или есть другой способ сделать это правильно?

p.s. Я знаю, что всегда могу вернуться к началу слова в цикле, но это выглядит странно и не относится ко всем языкам. Я уверен, что в Android есть какой-то элегантный способ сделать это, но я не знаю API / Flag для использования.

p.p.s Иногда TextView использует тире (-), чтобы разбить длинное слово между строками, правила для этого неясны.

...