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