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:
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 top
e ascent
sono numeri negativi poiché sono misurati dalla linea di base (mentre la discesa e il fondo sono numeri positivi). Quindi, per ottenere la distanza da top
a bottom
dovresti 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 che0
e 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 TextView
with setLineSpacing
in code o android:lineSpacingExtra
e android:lineSpacingMultiplier
in 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.
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 top
o 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:
I segni diacritici vanno sopra top
e 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 top
e bottom
. E di solito rimarranno entro ascent
e decent
. Se per qualsiasi motivo hai bisogno di sapere con certezza se le lettere vanno oltre top
o bottom
puoi usare TextPaint.getTextBounds
.