Signification du haut, de la montée, de la ligne de base, de la descente, du bas et de la tête dans FontMetrics d'Android

90

Cela semble être une question basique, mais je n'ai pas trouvé de question similaire sur SO. En lisant la documentation , j'avais du mal à saisir les concepts. Je veux comprendre quelle est la différence entre topet ascentet aussi bottomet descent. Et où est exactement la ligne de base? Avez-vous un diagramme pour m'aider à le visualiser?

Suragch
la source

Réponses:

287

Voyons d'abord ce que dit la documentation :

  • Haut - La distance maximale au-dessus de la ligne de base pour le glyphe le plus haut de la police à une taille de texte donnée.
  • Ascension - La distance recommandée au-dessus de la ligne de base pour le texte à espacement simple.
  • Descente - La distance recommandée sous la ligne de base pour le texte à espacement simple.
  • Bas - La distance maximale sous la ligne de base pour le glyphe le plus bas de la police à une taille de texte donnée.
  • Interlignage - L'espace supplémentaire recommandé à ajouter entre les lignes de texte.

Notez que la ligne de base est ce à partir de laquelle les quatre premiers sont mesurés. C'est la ligne qui forme la base sur laquelle repose le texte, même si certains caractères (comme g, y, j, etc.) peuvent avoir des parties qui vont en dessous de la ligne. C'est comparable aux lignes sur lesquelles vous écrivez dans un cahier ligné.

Voici une image pour vous aider à visualiser ces choses:

FontMetrics montrant le haut, l'ascension, la ligne de base, la décente, le bas et le début

N'oubliez pas que lorsque vous dessinez sur un canevas en Java et Android, la baisse est une augmentation de y et la hausse est une diminution de y. Cela signifie que FontMetrics topet ascentsont des nombres négatifs puisqu'ils sont mesurés à partir de la ligne de base (tandis que la descente et le bas sont des nombres positifs). Ainsi, pour obtenir la distance de topà, bottomvous devez faire ( bottom- top).

Le chef de file est la distance entre le fond d'une ligne et le début de la ligne suivante. Dans l'image ci-dessus, c'est l'espace entre l'orange de la ligne 1 et le violet de la ligne 2. Comme @MajorTom l'a noté ci - dessous , en typographie, le terme est plus correctement défini comme «la distance entre les lignes de base des lignes successives de type». * Cependant, Android semble utiliser le terme dans un sens plus historique. Le mot (prononcé "ledding") vient de la bande de plomb que les anciens compositeurs mettaient entre les lignes de caractères. C'était essentiellement un moyen d'ajuster l'interligne. Dans Android, je n'ai jamais vu le leader être autre chose que0et je ne l'ai pas vu utilisé pour quoi que ce soit dans le code source. (Corrigez-moi si vous savez où il est utilisé pour calculer quoi que ce soit.) Vous pouvez modifier l'interligne dans un TextViewavec setLineSpacingdans le code ou android:lineSpacingExtraet android:lineSpacingMultiplierdans xml. Ces méthodes , cependant, n'utilisent ni ne modifient le début.

Consultez ces liens pour plus d'informations:

Explore plus

Afin d'explorer davantage les métriques de police, j'ai fait un projet simple.

entrez la description de l'image ici

Plutôt que de lister tout le code ici. J'ai ajouté le projet à GitHub . Vous pouvez soit cloner le projet, soit copier les fichiers suivants dans un nouveau projet.

Les lettres vont-elles parfois au-dessus topou au -dessous bottom?

Pas généralement, mais ils le pouvaient. Le haut et le bas, tels que je les comprends, sont définis par la police (d'où "FontMetrics"), donc un créateur de polices pourrait faire monter un glyphe plus haut que ce qu'il dit que le haut est (ou plus bas que le bas). En outre, la combinaison de signes diacritiques en Unicode peut très facilement se produire. Voici un exemple assez extrême (tiré d' ici): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

En branchant cette chaîne sur Android, nous obtenons ceci:

entrez la description de l'image ici

Les signes diacritiques vont au-dessus topet au-dessous du bottom. Il est intéressant de noter que la largeur et la hauteur totales sont cependant correctement mesurées par les limites du texte.

Quoi qu'il en soit, à toutes fins pratiques dans votre programmation, vous pouvez simplement supposer que le max et le min pour les lettres de glyphe sont topet bottom. Et généralement, ils resteront à l'intérieur ascentet decent. Si, pour une raison quelconque, vous devez savoir avec certitude si les lettres vont au-delà topou si bottomvous pouvez les utiliser TextPaint.getTextBounds.

Suragch
la source
Agréable! Savez-vous dans quelles unités sont mesurées l'ascension, la descente, etc.? Sont-ils en pixels? Ce sont des valeurs flottantes mais je ne sais pas comment elles correspondent à l'écran. Je les ai vérifiés dans Photoshop pour voir s'il s'agit de pixels et il y a une légère différence de quelques unités; les pixels étant plus petits.
Vikram Gupta
@VikramGupta. Les unités sont des pixels. Je ne sais pas ce qui a causé la différence avec votre vérification d'image Photoshop.
Suragch le
Merci pour l'explication utile et l'application. Mais, pouvez-vous expliquer plus en détail, qu'est-ce que c'est exactement Top? Y aura-t-il une lettre assez haute pour toucher la Topligne? Par exemple, "M", "l" semble être la lettre la plus haute. Aucun d'eux ne se touche Top.
Cheok Yan Cheng
@CheokYanCheng, voir la mise à jour à la fin de ma réponse.
Suragch
@Suragch Merci pour l'info. J'utilise votre application pour en savoir plus. Je pense que la ligne "Ascent" touchera simplement le haut de la police comme sur votre capture d'écran. Cependant, d'après le dernier i.imgur.com/aRxgjvu.png , il ne touche pas le plus grand caractère "M". Avez-vous une idée pourquoi?
Cheok Yan Cheng
5

L'interligne n'est PAS un espace entre les lignes dans la typographie. Apparemment, c'est quelque chose que le code Android ne prend pas en compte. Nous nous sommes débattus avec cela nous-mêmes. La bonne définition de leader ( de Wikipedia ):

En typographie, le début / ˈlɛdɪŋ / fait référence à la distance entre les lignes de base de lignes successives de type. Le terme est né à l'époque de la composition manuelle, lorsque de fines bandes de plomb étaient insérées dans les formulaires pour augmenter la distance verticale entre les lignes de caractères.

D'après ce que je peux dire, Android n'a aucun moyen de le spécifier.

MajorTom
la source
+1 pour m'aider à mieux comprendre le leadership. En ce qui concerne le changement de début, vous pouvez utiliser TextView setLineSpacingdans le code ou android:lineSpacingExtraet android:lineSpacingMultiplierdans xml.
Suragch le
Merci - oui, on nous a dit d'utiliser android:lineSpacingExtrace qui mettrait une mesure entre l'espace réel entre les lignes. Ce n'est pas de premier plan, mais cela semble être le seul moyen de gérer l'espacement. C'est un problème car il n'y a pas de telle mesure dans la typographie, et il n'y a pas de moyen de spécifier cette mesure dans Sketch ou Zepelin (les outils que nous utilisons). De plus, il ne correspond pas au leader.
MajorTom
1
Si le début typographique est la distance entre les lignes de base, il semble que cela devrait être facile à calculer.
Suragch
C'est ce que je pensais. Existe-t-il un moyen de le faire par programme? J'espérais qu'avec les méthodes fournies par Android, il pourrait y avoir un moyen de le faire. Les développeurs avec lesquels nous travaillons ne semblent pas savoir.
MajorTom
Cela fait un moment que je n'ai pas travaillé avec cela, mais si je devais le reprendre, je commencerais ici et ici et j'expérimenterais avec différents textes et polices. Même si ce n'est pas simple, je ne peux pas croire qu'il n'y ait pas de moyen de calculer ce dont vous avez besoin.
Suragch le