Significato di top, ascent, baseline, descent, bottom e leading in FontMetrics di Android


90

Questa sembra una domanda di base, ma non sono riuscito a trovarne una simile su SO. Durante la lettura della documentazione , ho avuto problemi a comprendere i concetti. Voglio capire qual è la differenza tra tope ascente anche bottome descent. E dov'è esattamente la linea di base? Hai un diagramma che mi aiuti a visualizzarlo?

Risposte:


287

Rivediamo prima cosa dice la documentazione :

  • In alto : la distanza massima sopra la linea di base per il glifo più alto nel carattere con una data dimensione del testo.
  • Ascesa : la distanza consigliata sopra la linea di base per il testo con spaziatura singola.
  • Discesa : la distanza consigliata sotto la linea di base per il testo con spaziatura singola.
  • In basso : la distanza massima al di sotto della linea di base per il glifo più basso nel carattere con una determinata dimensione del testo.
  • Interlinea : lo spazio aggiuntivo consigliato da aggiungere tra le righe di testo.

Nota che la linea di base è quella da cui vengono misurati i primi quattro. È la riga che forma la base su cui si trova il testo, anche se alcuni caratteri (come g, y, j, ecc.) Potrebbero avere parti che vanno sotto la riga. È paragonabile alle righe su cui scrivi in ​​un taccuino a righe.

Ecco un'immagine per aiutare a visualizzare queste cose:

FontMetrics che mostra superiore, ascendente, linea di base, decente, inferiore e iniziale

Ricorda che quando disegni su una tela in Java e Android, andare verso il basso è un aumento di y e salire è una diminuzione di y. Ciò significa che FontMetrics tope ascentsono numeri negativi poiché sono misurati dalla linea di base (mentre la discesa e il fondo sono numeri positivi). Quindi, per ottenere la distanza da topa bottomdovresti fare ( bottom- top).

L' interlinea è la distanza tra la parte inferiore di una riga e la parte superiore della riga successiva. Nell'immagine sopra, è lo spazio tra l'arancione della riga 1 e il viola della riga 2. Come ha notato @MajorTom di seguito , in tipografia il termine è più propriamente definito come "la distanza tra le linee di base di righe di testo successive". * Tuttavia, Android sembra utilizzare il termine in un senso più storico. La parola (pronunciata "ledding") deriva dalla striscia di piombo che i vecchi tipografi usavano mettere tra le righe di testo. Fondamentalmente era solo un modo per regolare l'interlinea. In Android non ho mai visto il leader essere altro che0e non l'ho visto usato per niente nel codice sorgente. (Correggimi se sai dove viene utilizzato per calcolare qualcosa.) Puoi cambiare l'interlinea in a TextViewwith setLineSpacingin code o android:lineSpacingExtrae android:lineSpacingMultiplierin xml. Questi metodi , tuttavia, non utilizzano né modificano l'interlinea.

Dai un'occhiata a questi link per maggiori informazioni:

Esplora di più

Per esplorare di più le metriche dei caratteri, ho realizzato un semplice progetto.

inserisci qui la descrizione dell'immagine

Piuttosto che elencare tutto il codice qui. Ho aggiunto il progetto a GitHub . Puoi clonare il progetto o copiare i seguenti file in un nuovo progetto.

Le lettere vanno mai sopra topo sotto bottom?

Di solito no, ma potrebbero. L'alto e il basso, a quanto ho capito, sono impostati dal carattere (da qui "FontMetrics"), quindi un creatore di caratteri potrebbe fare in modo che un glifo vada più in alto di quello che dice sia in alto (o più in basso rispetto al fondo). Inoltre, combinando i segni diacritici in Unicode può accadere molto facilmente. Ecco un esempio piuttosto estremo (tratto da qui): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑Ša͔̟̝͔ͥ̈

Collegando quella stringa ad Android otteniamo questo:

inserisci qui la descrizione dell'immagine

I segni diacritici vanno sopra tope sotto il bottom. È interessante notare che la larghezza e l'altezza totali sono misurate correttamente dai limiti del testo, però.

Ad ogni modo, per tutti gli scopi pratici nella tua programmazione, puoi semplicemente presumere che il massimo e il minimo per le lettere dei glifi siano tope bottom. E di solito rimarranno entro ascente decent. Se per qualsiasi motivo hai bisogno di sapere con certezza se le lettere vanno oltre topo bottompuoi usare TextPaint.getTextBounds.


Bello! Sai in quali unità vengono misurate l'ascesa, la discesa, ecc.? Sono in pixel? Sono valori float ma non sono sicuri di come corrispondono allo schermo. Li ho controllati in Photoshop per vedere se sono pixel e c'è una leggera differenza di poche unità; pixel più piccoli.
Vikram Gupta

@VikramGupta. Le unità sono pixel. Non sono sicuro di cosa abbia causato la differenza con il controllo dell'immagine di Photoshop.
Suragch

Grazie per l'utile spiegazione e l'app. Ma puoi spiegare ulteriormente cosa è esattamente Top? Ci sarà una lettera abbastanza alta da toccare la Toplinea? Ad esempio, "M", "l" sembra essere la lettera più alta. Nessuno di loro si tocca Top.
Cheok Yan Cheng

@CheokYanCheng, guarda l'aggiornamento alla fine della mia risposta.
Suragch

@ Suragch Grazie per le informazioni. Uso la tua app per capire di più. Mi aspetto che la riga "Ascent" tocchi bene la parte superiore del carattere come nel tuo screenshot. Tuttavia, dall'ultimo i.imgur.com/aRxgjvu.png , non tocca il carattere più alto "M". Hai idea del perché?
Cheok Yan Cheng,

5

Il leader NON è lo spazio tra le righe nella tipografia. Apparentemente questo è qualcosa che il codice Android non tiene in considerazione. Abbiamo lottato con questo noi stessi. La definizione corretta di leading ( da Wikipedia ):

In tipografia, l'interlinea / ˈlɛdɪŋ / si riferisce alla distanza tra le linee di base di successive righe di testo. Il termine ha avuto origine ai tempi della composizione a mano, quando sottili strisce di piombo venivano inserite nei moduli per aumentare la distanza verticale tra le righe di testo.

Da quello che posso dire, Android non ha un modo per specificarlo.


+1 per avermi aiutato a capire meglio la leadership. Per quanto riguarda il cambio di interlinea, puoi usare TextView setLineSpacingnel codice o android:lineSpacingExtrae android:lineSpacingMultiplierin xml.
Suragch,

Grazie - sì, ci è stato detto di usare android:lineSpacingExtrache metterebbe una misura tra lo spazio effettivo tra le linee. Non è leader, ma sembra l'unico modo per gestire la spaziatura. È un problema perché non esiste una tale misurazione nella tipografia e non esiste un modo per specificare quella misura in Sketch o Zepelin (gli strumenti che usiamo). Inoltre non corrisponde al leader.
MajorTom

1
Se l'interlinea tipografica è la distanza tra le linee di base, sembra che dovrebbe essere facile da calcolare.
Suragch

È quello che pensavo. C'è un modo per farlo a livello di codice? Speravo che con i metodi forniti da Android ci fosse un modo per farlo. Gli sviluppatori con cui lavoriamo non sembrano saperlo.
MajorTom

È passato un po 'di tempo da quando ho lavorato con questo, ma se volessi riprenderlo, ricomincerei qui e qui e sperimenterei con testo e caratteri diversi. Anche se non è semplice, non posso credere che non ci sia un modo per calcolare ciò di cui hai bisogno.
Suragch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.