Esistono diversi modi per misurare l'altezza in base a ciò di cui hai bisogno.
Se stai facendo qualcosa come centrare con precisione una piccola quantità di testo fisso, probabilmente vorrai getTextBounds
. Puoi ottenere il rettangolo di delimitazione in questo modo
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Come puoi vedere per le seguenti immagini, stringhe diverse daranno altezze diverse (mostrate in rosso).
Queste altezze diverse potrebbero essere uno svantaggio in alcune situazioni in cui hai solo bisogno di un'altezza costante, indipendentemente dal testo. Vedi la prossima sezione
È possibile calcolare l'altezza del carattere dalla metrica del carattere. L'altezza è sempre la stessa perché è ottenuta dal carattere, non da una particolare stringa di testo.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
La linea di base è la linea su cui si trova il testo. La discesa è generalmente la più lontana da un personaggio sotto la linea e la salita è generalmente la più lontana da un personaggio sopra la linea. Per ottenere l'altezza devi sottrarre la salita perché è un valore negativo. (La linea di base è y=0
e y
riduce lo schermo.)
Guarda l'immagine seguente. Le altezze per entrambe le corde sono 234.375
.
Se si desidera l'altezza della linea anziché solo l'altezza del testo, è possibile effettuare le seguenti operazioni:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Questi sono i bottom
e top
della linea. La spaziatura iniziale (interlinea) è generalmente zero, ma è necessario aggiungerla comunque.
Le immagini sopra provengono da questo progetto . Puoi giocarci attorno per vedere come funzionano le metriche dei caratteri.
Per misurare l'altezza del testo su più righe devi usare a StaticLayout
. Ne ho parlato in dettaglio in questa risposta , ma il modo di base per ottenere questa altezza è il seguente:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();