Я хочу подсчитать, сколько строк нужно разместить в некотором тексте с фиксированной шириной 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 использует тире (-), чтобы разбить длинное слово между строками, правила для этого неясны.