2017-01-18 15 views
1

Рассмотрим этот простой пример:Как LineSpace Влияет StaticLayout Рост в одной строке текста

У меня есть один текст строку: «Hello»

Я хочу измерить этот текст с помощью StaticLayout. Так что я написал что-то вроде этого:

StaticLayout layout = new StaticLayout("Hello", myTextView.getPaint(), myTextView.getWidth(), Layout.Alignment.NORMAL, 1, lineSpace, false); 

В коде выше я изменил переменную lineSpace в цикле и каждый раз, когда необходимо войти высоту компоновщика:

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't не изменяется с несколькими значениями lineSpace. Но в более низких версиях макета андроидов, соответственно, изменялась высота строки.

Хотя, если ваш текст более чем одной строки, 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 
} 

ответ

2

Я некоторые быстро рыть в исходном коде, как представляется, что this part является виновником:

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 и, следовательно, добавьте интервал к последней строке.

Условие было добавлено в this commit, что, если мой GitHub Foo не подведи меня, должны быть включены начиная с Android 5.

Судя по всему, так же, как коммит упоминает, это влияет только на тексты однострочные, для многострочных текстов высота, по-видимому, вычисляется правильно. Поэтому простым решением может быть проверка того, имеет ли текст только одну строку (используя getLineCount()), и если версия Android меньше 5, и если это так, сравните интервал между строками один раз.

+0

Я сомневаюсь в Android 5, но кажется, что количество строк не влияет на последнее дополнительное пространство. Я сделал несколько тестов об этом. – Hojjat

+0

Кажется, что начиная с линейки в 5-дюймовом Android-пространстве для последней строки не учитывается. Спасибо – Hojjat

+0

Я разместил некоторые вопросы о ImageSpan и StaticLayout в ссылках ниже, но никто еще не ответил мне. Если вы не возражаете, пожалуйста, взгляните на эти вопросы: http://stackoverflow.com/questions/41671028/how-textsize-and-linespace-affects-imagespan – Hojjat