Significado de arriba, ascenso, línea de base, descenso, fondo y liderazgo en FontMetrics de Android

90

Esta parece una pregunta básica, pero no pude encontrar una similar en SO. Mientras leía la documentación , tenía problemas para comprender los conceptos. Quiero entender cuál es la diferencia entre topy ascenty también bottomy descent. ¿Y dónde está exactamente la línea de base? ¿Tiene un diagrama que me ayude a visualizarlo?

Suragch
fuente

Respuestas:

287

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:

FontMetrics que muestra superior, ascendente, base, decente, inferior y líder

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 ' topy ascentson 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 topa bottomdeberí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 que0y 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 TextViewcon setLineSpacingen o android:lineSpacingExtray android:lineSpacingMultiplieren 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.

ingrese la descripción de la imagen aquí

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 topo 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:

ingrese la descripción de la imagen aquí

Las marcas diacríticas van por encima topy 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 topy bottom. Y por lo general se quedarán dentro ascenty decent. Si por alguna razón necesitas saber con certeza si las letras van más allá topo bottompuedes usar TextPaint.getTextBounds.

Suragch
fuente
¡Agradable! ¿Sabes en qué unidades se mide el ascenso, descenso, etc.? ¿Están en píxeles? Son valores flotantes pero no estoy seguro de cómo se corresponden con la pantalla. Los revisé en Photoshop para ver si son píxeles y hay una ligera diferencia de algunas unidades; los píxeles son más pequeños.
Vikram Gupta
@VikramGupta. Las unidades son píxeles. No estoy seguro de qué causó la diferencia con su verificación de imagen de Photoshop.
Suragch
Gracias por la explicación útil y la aplicación. Pero, ¿puedes explicar más qué es exactamente Top? ¿Habrá alguna letra lo suficientemente alta como para tocar la Toplínea? Por ejemplo, "M", "l" parece ser la letra más alta. Ninguno de ellos tocándose Top.
Cheok Yan Cheng
@CheokYanCheng, vea la actualización al final de mi respuesta.
Suragch
@Suragch Gracias por la información. Utilizo tu aplicación para entender más. Espero que la línea "Ascent" toque bien la parte superior de la fuente como en la captura de pantalla. Sin embargo, desde el último i.imgur.com/aRxgjvu.png , no toca el carácter más alto "M". ¿Tienes idea de por qué?
Cheok Yan Cheng
5

Liderar NO es espacio entre líneas en tipografía. Al parecer, esto es algo que el código de Android no tiene en cuenta. Nosotros mismos hemos estado luchando con esto. La definición adecuada de líder ( de Wikipedia ):

En tipografía, inicial / ˈlɛdɪŋ / se refiere a la distancia entre las líneas de base de las sucesivas líneas de texto. El término se originó en los días de la tipografía manual, cuando se insertaron finas tiras de plomo en los formularios para aumentar la distancia vertical entre las líneas de tipografía.

Por lo que puedo decir, Android no tiene forma de especificar esto.

MajorTom
fuente
+1 por ayudarme a entender mejor el liderazgo. En lo que respecta al cambio de liderazgo, puede usar TextView setLineSpacingen código o android:lineSpacingExtray android:lineSpacingMultiplieren xml.
Suragch
Gracias, sí, nos dijeron que usemos android:lineSpacingExtralo que pondría una medida entre el espacio real entre las líneas. No es líder, pero parece ser la única forma de administrar el espaciado. Es un problema porque no existe tal medida en tipografía, y no existe tal forma de especificar esa medida en Sketch o Zepelin (las herramientas que usamos). Además, no coincide con el líder.
MajorTom
1
Si el interlineado tipográfico es la distancia entre líneas de base, parece que debería ser fácil de calcular.
Suragch
Eso es lo que pensé. ¿Hay alguna forma de hacerlo mediante programación? Esperaba que, con los métodos que proporciona Android, hubiera una forma de hacerlo. Los desarrolladores con los que trabajamos no parecen saberlo.
MajorTom
Ha pasado un tiempo desde que trabajé con esto, pero si fuera a retomarlo, comenzaría aquí y aquí y experimentaría con diferentes textos y fuentes. Incluso si no es sencillo, no puedo creer que no haya una forma de calcular lo que necesita.
Suragch