Как LineSpace влияет на высоту StaticLayout в одной строке текста
Рассмотрим этот простой пример:
У меня есть одна строка текста, как это: "Привет"
Я хочу измерить этот текст, используя StaticLayout. Поэтому я написал что-то вроде этого:
StaticLayout layout = new StaticLayout("Hello", myTextView.getPaint(), myTextView.getWidth(), Layout.Alignment.NORMAL, 1, lineSpace, false);
В приведенном выше коде я изменил переменную lineSpace в цикле for и каждый раз записываю высоту макета:
for(int lineSpace=0; lineSpace<20;lineSpace++){
StaticLayout layout = new StaticLayout("Hello", myTextView.getPaint(), myTextView.getWidth(), Layout.Alignment.NORMAL, 1, lineSpace, false);
Log.d("TAG", "layout height: " + layout.getHeight());
}
Когда я запускаю этот код на устройстве с android M layout, высота не изменяется с несколькими значениями lineSpace. Но в более низких версиях Android высота компоновки изменялась соответственно с пробелом.
Хотя, когда ваш текст больше одной строки,StaticLayout учитывает расстояние между двумя строками. Но, похоже, Android M не учитывает пробел в последней строке, а более низкие версии Android.
Мой вопрос заключается в следующем: после какой версии Android StaticLayout учитывает пространство строки для последней строки? Могу ли я написать что-то вроде этого:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// in this version StaticLayout don't consider line space for last line
} else {
// in this version StaticLayout consider line space for last line
}
1 ответ
Я сделал несколько быстрых копаний в исходном коде, кажется, что эта часть является виновником:
if (needMultiply && !lastLine) {
double ex = (below - above) * (spacingmult - 1) + spacingadd;
if (ex >= 0) {
extra = (int)(ex + EXTRA_ROUNDING);
} else {
extra = -(int)(-ex + EXTRA_ROUNDING);
}
} else {
extra = 0;
}
В старых версиях отсутствуют !lastLine
условие и, следовательно, также добавить интервал в последнюю строку.
В этот коммит было добавлено условие, которое, если мой github foo не подведет меня, должно быть включено, начиная с Android 5.
По-видимому, так же, как упоминается фиксация, это влияет только на однострочные тексты, для многострочных текстов высота, кажется, рассчитывается правильно. Таким образом, можно легко проверить, имеет ли текст только одну строку (с помощью getLineCount()) и версия Android меньше 5, и если это так, вычтите один раз межстрочный интервал.