Значение вершины, подъема, базовой линии, спуска, дна и лидирующих в Android FontMetrics
Это кажется основным вопросом, но я не смог найти аналогичного вопроса на SO. При чтении документации у меня возникли проблемы с пониманием концепций. Я хочу понять, в чем разница между top
а также ascent
а также bottom
а также descent
, И где именно находится базовый уровень? У вас есть диаграмма, чтобы помочь мне визуализировать это?
2 ответа
Давайте сначала рассмотрим, что говорится в документации:
- Верх. Максимальное расстояние над базовой линией для самого высокого символа шрифта при заданном размере текста.
- Восхождение - рекомендуемое расстояние над базовой линией для выделенного текста.
- Спуск - рекомендуемое расстояние ниже базовой линии для выделенного текста.
- Bottom - максимальное расстояние ниже базовой линии для самого низкого символа шрифта при заданном размере текста.
- Ведущий - рекомендуемое дополнительное пространство для добавления между строками текста.
Обратите внимание, что базовая линия - это то, от чего измеряются первые четыре. Это строка, которая формирует основу, на которой располагается текст, даже если некоторые символы (например, g, y, j и т. Д.) Могут иметь части, которые идут ниже линии. Это сравнимо с тем, что вы пишете в тетради на подкладке.
Вот картина, чтобы помочь визуализировать эти вещи:
Помните, что при рисовании на холсте в 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. Эти методы, однако, не используют и не изменяют ведущие.
Проверьте эти ссылки для получения дополнительной информации:
- Точное рисование текста на Android
- Метрики шрифта в Java (и Android)
- Макетная документация
- Java: восхождение FontMetrics неверно?
- FontMetrics не правильно при запуске на устройстве Android. Симулятор отлично
- Метрики шрифта Java (Java, кажется, не использует
top
а такжеbottom
)
Узнайте больше
Чтобы больше узнать о метриках шрифта, я сделал простой проект.
Вместо того, чтобы перечислить весь код здесь. Я добавил проект в GitHub. Вы можете либо клонировать проект, либо скопировать следующие файлы в новый проект.
- FontMetricsView.java (пользовательский вид)
- MainActivity.java
- activity_main.xml
Письма когда-нибудь идут выше 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 нет способа указать это.