Давайте сначала посмотрим, что говорится в документации :
- Сверху - максимальное расстояние над базовой линией для самого высокого глифа в шрифте при заданном размере текста.
- Подъем - рекомендуемое расстояние над базовой линией для выделенного текста.
- По убыванию - рекомендуемое расстояние ниже базовой линии для выделенного текста.
- Снизу - максимальное расстояние ниже базовой линии для самого нижнего глифа в шрифте при заданном размере текста.
- Ведущий - рекомендуемый дополнительный интервал между строками текста.
Обратите внимание, что базовая линия - это то, от чего измеряются первые четыре. Это строка, которая образует основу , на которой находится текст, даже если некоторые символы (например, g, y, j и т. Д.) Могут иметь части, которые идут ниже строки. Это похоже на строки, которые вы пишете в линованной тетради.
Вот картинка, которая поможет визуализировать эти вещи:
Помните, что при рисовании на холсте в Java и Android, уменьшение означает увеличение y, а увеличение - уменьшение y. Это означает, что FontMetrics ' top
и ascent
являются отрицательными числами, поскольку они отсчитываются от базовой линии (в то время как descent и bottom - положительные числа). Таким образом, чтобы получить расстояние от top
до, bottom
вам нужно будет сделать ( bottom
- top
).
Ведущим является расстояние между нижней частью одной линии и в верхней части следующей строки. На рисунке выше это промежуток между оранжевым цветом строки 1 и фиолетовым цветом строки 2. Как @MajorTom отметил ниже , в типографике термин более правильно определяется как «расстояние между базовыми линиями следующих друг за другом строк текста ». * Однако Android, похоже, использует этот термин в более историческом смысле. Слово (произносится как «ledding») происходит от свинцовой ленты, которую старые наборщики помещали между строками шрифта. По сути, это был просто способ отрегулировать межстрочный интервал. В Android я на самом деле никогда не видел, чтобы ведущим был что-то, кроме0
и я не видел, чтобы он использовался ни для чего в исходном коде. (Поправьте меня, если вы знаете, где он используется для вычисления чего-либо.) Вы можете изменить межстрочный интервал в с TextView
помощью setLineSpacing
в коде или android:lineSpacingExtra
и android:lineSpacingMultiplier
в xml. Однако эти методы не используют и не изменяют интерлиньяж.
Ознакомьтесь с этими ссылками для получения дополнительной информации:
Узнать больше
Чтобы больше изучить параметры шрифта, я сделал простой проект.
Вместо того, чтобы перечислять здесь весь код. Я добавил проект на GitHub . Вы можете либо клонировать проект, либо скопировать следующие файлы в новый проект.
Буквы когда-нибудь идут выше top
или ниже bottom
?
Не обычно, но могли. Верх и низ, как я понимаю, задаются шрифтом (отсюда «FontMetrics»), поэтому создатель шрифта может сделать глиф выше, чем то, что они говорят, верх (или ниже низа). Кроме того, это может очень легко случиться с объединением диакритических знаков в Unicode. Вот довольно крайний пример (взят отсюда): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
Подключив эту строку к Android, мы получим следующее:
Диакритические знаки ставятся над top
и под bottom
. Интересно отметить, что общая ширина и высота правильно измеряются рамками текста.
В любом случае, для всех практических целей вашего программирования вы можете просто предположить, что максимальные и минимальные значения для букв глифов равны top
и bottom
. И обычно они остаются в пределах ascent
и descent
. Если по какой-либо причине вам нужно точно знать, выходят ли буквы за рамки top
или bottom
вы можете использовать TextPaint.getTextBounds
.
Top
? Будет ли какая-нибудь буква достаточно высокой, чтобы касатьсяTop
линии? Например, «М», «л» кажется самой высокой буквой. Никто из них не трогаетTop
.Интерлиньяж - это НЕ пространство между строками в типографике. Очевидно, это то, что код Android не принимает во внимание. Мы сами с этим боролись. Правильное определение ведущего ( из Википедии ):
Насколько я могу судить, в Android нет возможности указать это.
источник
setLineSpacing
в коде илиandroid:lineSpacingExtra
иandroid:lineSpacingMultiplier
в XML.android:lineSpacingExtra
который поместит измерение между фактическим расстоянием между строками. Это не ведущий, но кажется, что это единственный способ управлять интервалом. Это проблема, потому что в типографике нет такого измерения, и нет такого способа указать его в Sketch или Zepelin (инструменты, которые мы используем). Плюс не соответствует ведущей.