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


90

Це здається основним запитанням, але я не міг знайти подібне на SO. Читаючи документацію , у мене були проблеми з розумінням концепцій. Я хочу зрозуміти, в чому різниця між topі, ascentа також bottomі descent. А де саме базовий рівень? У вас є схема, яка допоможе мені її візуалізувати?

Відповіді:


286

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

  • Зверху - максимальна відстань над базовою лінією для найвищого гліфу шрифту при заданому розмірі тексту.
  • Підйом - Рекомендована відстань над базовою лінією для виділеного інтервалу.
  • Спуск - Рекомендована відстань нижче базової лінії для виділеного інтервалу.
  • Знизу - максимальна відстань нижче базової лінії для найнижчого рівня гліфу в шрифті при заданому розмірі тексту.
  • Провідний - Рекомендований додатковий пробіл для додавання між рядками тексту.

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

Підключаючи цей рядок до Android, ми отримуємо таке:

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

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

У будь-якому випадку, з усіх практичних цілей у вашому програмуванні ви можете просто припустити, що максимум і мінімум для букв гліфів складають topі bottom. І зазвичай вони залишаться в межах ascentі decent. Якщо з якихось причин вам потрібно точно знати, чи букви виходять за рамки, topабо bottomви можете використовувати TextPaint.getTextBounds.


Приємно! Чи знаєте ви, в яких одиницях вимірюється сходження, спуск тощо? Вони в пікселях? Вони є плаваючими значеннями, але не впевнені, як вони відповідають екрану. Перевірив їх у фотошопі, чи це пікселі, і є невелика різниця в кілька одиниць; пікселів менше.
Вікрам Гупта,

@VikramGupta. Одиниці вимірювання - пікселі. Я не впевнений, що спричинило різницю у вашій перевірці зображень у Photoshop.
Сурач

Дякуємо за корисне пояснення та додаток. Але, чи можете ви далі пояснити, що саме Top? Чи буде якась буква, достатньо висока, щоб торкнутися Topрядка? Наприклад, "M", "l" здається найвищою літерою. Жоден з них не торкався Top.
Cheok Yan Cheng

@CheokYanCheng, див. Оновлення в кінці моєї відповіді.
Сурагч

@Suragch Дякую за інформацію. Я використовую ваш додаток, щоб зрозуміти більше. Я сподіваюся, що рядок "Підйом" просто торкнеться верхньої частини шрифту, як на знімку екрана. Однак, з останнього i.imgur.com/aRxgjvu.png , це не стосується найвищого символу "М". Ви уявляєте чому?
Cheok Yan Cheng

5

Провідні - це НЕ пробіл між рядками в друкарні. Мабуть, це те, що код Android не враховує. Ми самі з цим боролися. Правильне визначення ведучого ( з Вікіпедії ):

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

З того, що я можу сказати, Android не має способу вказати це.


+1 за допомогу мені зрозуміти лідерство краще. Що стосується зміни ведучого, ви можете використовувати TextView setLineSpacingв коді або android:lineSpacingExtraта android:lineSpacingMultiplierв xml.
Сурач

Дякую - так, нам сказали використовувати, android:lineSpacingExtraякий міг би вимірювати фактичний простір між рядками. Це не є провідним, але це, здається, єдиний спосіб керувати інтервалом. Це проблема, оскільки в типографіці немає такого вимірювання, і немає такого способу, щоб вказати цей захід у Sketch або Zepelin (інструменти, якими ми користуємось). Плюс це не відповідає провідним.
MajorTom

1
Якщо типографський провід - це відстань між базовими лініями, здається, це повинно бути легко розрахувати.
Сурач

Це те, що я думав. Чи є спосіб зробити це програмно? Я сподівався, що за допомогою методів, передбачених Android, можливо, буде спосіб це зробити. Здається, розробники, з якими ми працюємо, не знають.
MajorTom

Минув деякий час з того часу, як я працював із цим, але якби я збирався взятися за це знову, я б почав тут і тут і експериментував з різним текстом та шрифтами. Навіть якщо це не прямо, я не можу повірити, що немає способу розрахувати, що вам потрібно.
Сурагч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.