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