Значение вершины, подъема, базовой линии, спуска, дна и лидирующих в Android FontMetrics

Это кажется основным вопросом, но я не смог найти аналогичного вопроса на SO. При чтении документации у меня возникли проблемы с пониманием концепций. Я хочу понять, в чем разница между top а также ascent а также bottom а также descent, И где именно находится базовый уровень? У вас есть диаграмма, чтобы помочь мне визуализировать это?

2 ответа

Решение

Давайте сначала рассмотрим, что говорится в документации:

  • Верх. Максимальное расстояние над базовой линией для самого высокого символа шрифта при заданном размере текста.
  • Восхождение - рекомендуемое расстояние над базовой линией для выделенного текста.
  • Спуск - рекомендуемое расстояние ниже базовой линии для выделенного текста.
  • Bottom - максимальное расстояние ниже базовой линии для самого низкого символа шрифта при заданном размере текста.
  • Ведущий - рекомендуемое дополнительное пространство для добавления между строками текста.

Обратите внимание, что базовая линия - это то, от чего измеряются первые четыре. Это строка, которая формирует основу, на которой располагается текст, даже если некоторые символы (например, g, y, j и т. Д.) Могут иметь части, которые идут ниже линии. Это сравнимо с тем, что вы пишете в тетради на подкладке.

Вот картина, чтобы помочь визуализировать эти вещи:

FontMetrics показывает верх, подъем, базовый уровень, приличный, нижний и ведущий

Помните, что при рисовании на холсте в Java и Android уменьшение вниз означает увеличение y, а увеличение - уменьшение y. Это означает, что FontMetrics top а также ascent являются отрицательными числами, так как они измеряются от базовой линии (в то время как спуск и низ являются положительными числами). Таким образом, чтобы получить расстояние от top в bottom вам нужно будет сделать (bottom - top).

Лидером является расстояние между нижней частью одной строки и вершиной следующей строки. На рисунке выше это промежуток между оранжевым в строке 1 и фиолетовым в строке 2. Как отметил ниже @MajorTom, в типографии термин более правильно определяется как "расстояние между базовыми линиями последовательных линий типа". * Тем не менее, Android, кажется, использует этот термин в более историческом смысле. Слово (произносится "ledding") происходит от ведущей полосы, которую старые наборщики использовали для вставки между строками. Это был просто способ отрегулировать межстрочный интервал. В Android я никогда не видел, чтобы ведущим было что-либо, кроме 0 и я не видел, чтобы это использовалось для чего-либо в исходном коде. (Поправьте меня, если знаете, где он используется для вычисления чего-либо.) Вы можете изменить межстрочный интервал в TextView с setLineSpacing в коде или android:lineSpacingExtra а также android:lineSpacingMultiplier в XML. Эти методы, однако, не используют и не изменяют ведущие.

Проверьте эти ссылки для получения дополнительной информации:

Узнайте больше

Чтобы больше узнать о метриках шрифта, я сделал простой проект.

Вместо того, чтобы перечислить весь код здесь. Я добавил проект в GitHub. Вы можете либо клонировать проект, либо скопировать следующие файлы в новый проект.

Письма когда-нибудь идут выше top или ниже bottom?

Не обычно, но они могли. Верх и низ, как я их понимаю, задаются шрифтом (отсюда и "FontMetrics"), поэтому создатель шрифтов может сделать глиф выше, чем то, что они говорят, верх (или ниже, чем низ). Кроме того, с объединением диакритических знаков в Юникоде это может очень легко произойти. Вот довольно экстремальный пример (взяты из здесь):! M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬ ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝ HATs ̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑

Подключив эту строку к Android, мы получим следующее:

Диакритические знаки идут выше top и ниже bottom, Интересно отметить, что общая ширина и высота корректно измеряются границами текста.

В любом случае, для всех практических целей вашего программирования вы можете просто предположить, что max и min для глиф букв top а также bottom, И обычно они останутся в пределах ascent а также decent, Если по какой-либо причине вам необходимо точно знать, выходят ли буквы за пределы top или же bottom ты можешь использовать TextPaint.getTextBounds,

Лидерство - это НЕ пробел между строками в типографии. Видимо, это то, что Android код не учитывает. Мы боролись с этим сами. Правильное определение ведущих ( из Википедии):

В типографии ведущий /ˈlɛdɪŋ/ относится к расстоянию между базовыми линиями последовательных линий типа. Термин возник в дни ручного набора текста, когда тонкие полоски свинца вставлялись в формы для увеличения вертикального расстояния между линиями шрифта.

Из того, что я могу сказать, в Android нет способа указать это.

Другие вопросы по тегам