Primero revisemos lo que dice la documentación :
- Arriba : la distancia máxima por encima de la línea de base para el glifo más alto de la fuente con un tamaño de texto determinado.
- Ascenso : la distancia recomendada por encima de la línea de base para texto con espacio simple.
- Descenso : la distancia recomendada por debajo de la línea de base para texto con espacio simple.
- Inferior : la distancia máxima por debajo de la línea de base para el glifo más bajo de la fuente en un tamaño de texto determinado.
- Interlineado : el espacio adicional recomendado para agregar entre líneas de texto.
Tenga en cuenta que la línea de base es de lo que se miden los primeros cuatro. Es la línea que forma la base que se asienta el texto, aunque algunos caracteres (como g, y, j, etc.) pueden tener partes que van por debajo de la línea. Es comparable a las líneas en las que escribe en un cuaderno rayado.
Aquí hay una imagen para ayudar a visualizar estas cosas:
Recuerde que cuando se dibuja en un lienzo en Java y Android, bajar es un aumento de y y subir es una disminución de y. Eso significa que FontMetrics ' top
y ascent
son números negativos ya que se miden desde la línea de base (mientras que el descenso y la parte inferior son números positivos). Por lo tanto, para obtener la distancia de top
a bottom
debería hacer ( bottom
- top
).
El líder es la distancia entre la parte inferior de una línea y la parte superior de la siguiente. En la imagen de arriba, es el espacio entre el naranja de la Línea 1 y el púrpura de la Línea 2. Como @MajorTom señaló a continuación , en tipografía el término se define más apropiadamente como "la distancia entre las líneas de base de las sucesivas líneas de texto". * Sin embargo, Android parece usar el término en un sentido más histórico. La palabra (pronunciada "ledding") proviene de la tira de plomo que los antiguos tipógrafos solían poner entre líneas de texto. Básicamente era solo una forma de ajustar el interlineado. En Android, nunca he visto que el líder sea otra cosa que0
y no lo he visto usado para nada en el código fuente. (Corríjame si sabe dónde se usa para calcular algo). Puede cambiar el interlineado en un código TextView
con setLineSpacing
en o android:lineSpacingExtra
y android:lineSpacingMultiplier
en xml. Sin embargo, estos métodos no utilizan ni modifican el interlineado.
Consulte estos enlaces para obtener más información:
Explora más
Para explorar más Font Metrics, hice un proyecto simple.
En lugar de enumerar todo el código aquí. Yo añadí el proyecto de GitHub . Puede clonar el proyecto o copiar los siguientes archivos en un nuevo proyecto.
¿Alguna vez las letras van arriba top
o abajo bottom
?
Normalmente no, pero podrían. La parte superior e inferior, según tengo entendido, están configuradas por la fuente (de ahí "FontMetrics"), por lo que un creador de fuentes podría hacer que un glifo sea más alto que lo que dicen que es la parte superior (o más bajo que la parte inferior). Además, con la combinación de signos diacríticos en Unicode, puede suceder muy fácilmente. Aquí hay un ejemplo bastante extremo (tomado de aquí): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
Conectando esa cadena en Android obtenemos esto:
Las marcas diacríticas van por encima top
y por debajo del bottom
. Sin embargo, es interesante notar que el ancho y alto total se miden correctamente por los límites del texto.
De todos modos, para todos los propósitos prácticos de su programación, puede asumir que el máximo y el mínimo de las letras de glifo son top
y bottom
. Y por lo general se quedarán dentro ascent
y decent
. Si por alguna razón necesitas saber con certeza si las letras van más allá top
o bottom
puedes usar TextPaint.getTextBounds
.