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

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


person Suragch    schedule 24.12.2014    source источник


Ответы (2)


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

  • Сверху - максимальное расстояние над базовой линией для самого высокого глифа в шрифте при заданном размере текста.
  • Подъем - рекомендуемое расстояние над базовой линией для текста с отдельным интервалом.
  • По убыванию - рекомендуемое расстояние ниже базовой линии для выделенного текста.
  • Нижний - максимальное расстояние ниже базовой линии для самого нижнего глифа в шрифте при заданном размере текста.
  • Интерлиньяж - рекомендуемый дополнительный интервал между строками текста.

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

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

FontMetrics, показывающий верхнюю, восходящую, базовую, приличную, нижнюю и ведущую

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

Интервал - это расстояние между низом одной строки и верхом следующей строки. На изображении выше это промежуток между оранжевым цветом строки 1 и фиолетовым цветом строки 2. Как @MajorTom отмечено ниже, в типографике термин более правильно определяется как расстояние между базовыми линиями следующих друг за другом строк текста. * Однако, похоже, что Android использует этот термин в более историческом смысле. Слово (произносится как ledding) происходит от свинцовой ленты, которую старые наборщики помещали между строками шрифта. По сути, это был просто способ отрегулировать межстрочный интервал. В Android я на самом деле никогда не видел, чтобы ведущий был чем-то другим, кроме 0, и я не видел, чтобы он использовался для чего-либо в исходном коде. (Поправьте меня, если вы знаете, где он используется для каких-либо вычислений.) Вы можете изменить межстрочный интервал в TextView с помощью _ 9_ в коде или _ 10_ и android:lineSpacingMultiplier в xml. Однако эти методы не используют и не изменяют интерлиньяж.

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

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

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

 введите описание изображения здесь

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

Буквы когда-либо были выше top или ниже bottom?

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

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

введите описание изображения здесь

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

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

person Suragch    schedule 24.12.2014
comment
Хороший! Вы знаете, в каких единицах измеряются подъем, спуск и т. Д.? Они в пикселях? Это значения с плавающей запятой, но не уверен, как они соответствуют экрану. Проверил их в фотошопе, чтобы убедиться, что это пиксели, и есть ли небольшая разница в несколько единиц; пиксели меньше. - person Vikram Gupta; 07.04.2016
comment
@VikramGupta. Единицы - пиксели. Я не уверен, что вызвало разницу с вашей проверкой изображений в фотошопе. - person Suragch; 03.02.2017
comment
Спасибо за полезное объяснение и приложение. Но не могли бы вы объяснить, что такое Top? Будет ли какая-нибудь буква достаточно высокой, чтобы касаться Top линии? Например, M, l кажется самой высокой буквой. Никто из них не трогает Top. - person Cheok Yan Cheng; 26.08.2017
comment
@CheokYanCheng, см. Обновление в конце моего ответа. - person Suragch; 27.08.2017
comment
@Suragch Спасибо за информацию. Я использую ваше приложение, чтобы понять больше. Я ожидаю, что линия Ascent просто коснется верхней части шрифта так, как на вашем скриншоте. Однако из последней версии i.imgur.com/aRxgjvu.png он не касается самый высокий персонаж М. Вы знаете, почему? - person Cheok Yan Cheng; 27.08.2017
comment
@CheokYanCheng, я тоже сначала этого ожидал. Но помните, что M не обязательно является самым высоким глифом в шрифте. Или даже если это самая высокая буква в определенном шрифте, создатели шрифтов могут оставить место для других символов, которые могут быть выше. Не забывайте смайлики. Я только что протестировал смайлик ????, и он коснулся как подъема, так и приличных линий. Так что обычно латинские буквы никогда не касаются восходящей линии, что делает картинку в моем ответе немного обманчивой. - person Suragch; 28.08.2017

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

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

Насколько я могу судить, в Android нет возможности указать это.

person MajorTom    schedule 10.06.2016
comment
+1 за то, что помог мне лучше понять ведущую роль. Что касается изменения интерлиньяжа, вы можете использовать setLineSpacing TextView в коде или android:lineSpacingExtra и android:lineSpacingMultiplier в xml. - person Suragch; 11.06.2016
comment
Спасибо - да, нам сказали использовать android:lineSpacingExtra, который помещал бы измерение между фактическим пространством между строками. Это не ведущий, но кажется, что это единственный способ управлять интервалом. Это проблема, потому что в типографике нет такого измерения, и нет такого способа указать эту меру в Sketch или Zepelin (инструменты, которые мы используем). Плюс не соответствует ведущей. - person MajorTom; 12.06.2016
comment
Если типографский интерлиньяж - это расстояние между базовыми линиями, кажется, что его легко вычислить. - person Suragch; 12.06.2016
comment
Это то, о чем я думал. Есть ли способ сделать это программно? Я надеялся, что с помощью методов, которые предоставляет Android, может быть способ сделать это. Разработчики, с которыми мы работаем, похоже, не знают. - person MajorTom; 12.06.2016
comment
Прошло некоторое время с тех пор, как я работал с этим, но если бы я собирался заняться этим снова, я бы начал здесь и здесь и поэкспериментируйте с другим текстом и шрифтами. Даже если это непросто, я не могу поверить, что нет способа вычислить, что вам нужно. - person Suragch; 12.06.2016
comment
См. этот вопрос как Что ж. - person Suragch; 12.06.2016
comment
Это действительно определение из типографики, но в CSS по крайней мере промежутки между строками (из-за интерлиньяжа) делятся на верхнюю и нижнюю части строки, и, таким образом, высота строки измеряется между полями строки. . Это лучший способ, чем классическая типографика, которую нельзя было делать в былые времена. - person Marius; 07.04.2017