Il existe différentes façons de mesurer la hauteur en fonction de ce dont vous avez besoin.
Si vous faites quelque chose comme centrer précisément une petite quantité de texte fixe, vous le souhaitez probablement getTextBounds
. Vous pouvez obtenir le rectangle de délimitation comme ceci
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Comme vous pouvez le voir pour les images suivantes, différentes chaînes donneront des hauteurs différentes (indiquées en rouge).
Ces différentes hauteurs peuvent être un inconvénient dans certaines situations où vous avez juste besoin d'une hauteur constante, quel que soit le texte. Voir la section suivante.
Vous pouvez calculer la hauteur de la police à partir des métriques de police. La hauteur est toujours la même car elle est obtenue à partir de la police et non d'une chaîne de texte particulière.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
La ligne de base est la ligne sur laquelle se trouve le texte. La descente est généralement la plus éloignée qu'un personnage ira en dessous de la ligne et l'ascension est généralement la plus éloignée qu'un personnage ira au-dessus de la ligne. Pour obtenir la hauteur, vous devez soustraire l'ascension car c'est une valeur négative. (La ligne de base est y=0
et y
descend vers le haut de l'écran.)
Regardez l'image suivante. Les hauteurs des deux cordes sont 234.375
.
Si vous voulez la hauteur de ligne plutôt que simplement la hauteur du texte, vous pouvez procéder comme suit:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Ce sont les bottom
et top
de la ligne. L'interligne (espacement interligne) est généralement égal à zéro, mais vous devez quand même l'ajouter.
Les images ci-dessus proviennent de ce projet . Vous pouvez jouer avec pour voir comment fonctionnent les mesures de police.
Pour mesurer la hauteur d'un texte multiligne, vous devez utiliser un StaticLayout
. J'en ai parlé en détail dans cette réponse , mais le moyen de base pour obtenir cette hauteur est comme suit:
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();