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