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:
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 top
et ascent
sont 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
à, bottom
vous 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 que0
et 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 TextView
avec setLineSpacing
dans le code ou android:lineSpacingExtra
et android:lineSpacingMultiplier
dans 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.
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 top
ou 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:
Les signes diacritiques vont au-dessus top
et 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 top
et bottom
. Et généralement, ils resteront à l'intérieur ascent
et decent
. Si, pour une raison quelconque, vous devez savoir avec certitude si les lettres vont au-delà top
ou si bottom
vous pouvez les utiliser TextPaint.getTextBounds
.
Top
? Y aura-t-il une lettre assez haute pour toucher laTop
ligne? Par exemple, "M", "l" semble être la lettre la plus haute. Aucun d'eux ne se toucheTop
.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 ):
D'après ce que je peux dire, Android n'a aucun moyen de le spécifier.
la source
setLineSpacing
dans le code ouandroid:lineSpacingExtra
etandroid:lineSpacingMultiplier
dans xml.android:lineSpacingExtra
ce 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.