Un moyen simple de mesurer la hauteur du texte? La façon dont je le fais maintenant est d'utiliser Paint's measureText()
pour obtenir la largeur, puis par essais et erreurs, trouver une valeur pour obtenir une hauteur approximative. J'ai aussi joué avec FontMetrics
, mais tout cela semble être des méthodes approximatives qui craignent.
J'essaie de mettre les choses à l'échelle pour différentes résolutions. Je peux le faire, mais je me retrouve avec un code incroyablement détaillé avec beaucoup de calculs pour déterminer les tailles relatives. Je déteste ça! Il doit y avoir une meilleure façon.
android
graphics
view
android-canvas
Danedo
la source
la source
Il existe différentes façons de mesurer la hauteur en fonction de ce dont vous avez besoin.
getTextBounds
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 ceciComme 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.
Paint.FontMetrics
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.
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
ety
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:
Ce sont les
bottom
ettop
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.
StaticLayout
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:la source
getTextSize()
vous donne la taille de la police en unités de pixels (par opposition auxsp
unités). @androiddeveloperLa réponse de @ bramp est correcte - partiellement, en ce sens qu'elle ne mentionne pas que les limites calculées seront le rectangle minimum qui contient le texte entièrement avec les coordonnées de début implicites de 0, 0.
Cela signifie que la hauteur de, par exemple "Py" sera différente de la hauteur de "py" ou "hi" ou "oi" ou "aw" parce que, au niveau des pixels, ils nécessitent des hauteurs différentes.
Ce n'est en aucun cas un équivalent à FontMetrics dans Java classique.
Alors que la largeur d'un texte n'est pas très pénible, la hauteur l'est.
En particulier, si vous devez aligner verticalement le texte dessiné au centre, essayez d'obtenir les limites du texte "a" (sans guillemets), au lieu d'utiliser le texte que vous souhaitez dessiner. Travaille pour moi...
Voici ce que je veux dire:
Centrer verticalement le texte signifie aligner verticalement le rectangle de délimitation - ce qui est différent pour différents textes (majuscules, lettres longues, etc.). Mais ce que nous voulons en fait, c'est également aligner les lignes de base des textes rendus, de sorte qu'ils n'apparaissent pas surélevés ou rainurés. Ainsi, tant que nous connaissons le centre de la plus petite lettre ("a" par exemple), nous pouvons alors réutiliser son alignement pour le reste des textes. Cela permettra d'aligner tous les textes au centre et de les aligner sur la ligne de base.
la source
x >> 1
depuis des lustres. Upvoting only for that :)x / 2
et l'optimisera pourx >> 1
x / 2
est beaucoup plus convivial lors de la lecture de code, compte tenu du commentaire de Chris.buffer
cet exemple? Est-ce lecanvas
passé à ladraw(Canvas)
méthode?La hauteur correspond à la taille du texte que vous avez définie sur la variable Paint.
Une autre façon de connaître la hauteur est
la source
Vous pouvez utiliser la
android.text.StaticLayout
classe pour spécifier les limites requises, puis appelergetHeight()
. Vous pouvez dessiner le texte (contenu dans la mise en page) en appelant sadraw(Canvas)
méthode.la source
Vous pouvez simplement obtenir la taille du texte d'un objet Paint en utilisant la méthode getTextSize (). Par exemple:
la source
24.0f
?Vous devez utiliser
Rect.width()
etRect.Height()
qui est revenu à lagetTextBounds()
place. Ça marche pour moi.la source
Si quelqu'un a encore des problèmes, c'est mon code.
J'ai une vue personnalisée carrée (largeur = hauteur) et je souhaite lui attribuer un caractère.
onDraw()
montre comment obtenir une hauteur de caractère, même si je ne l'utilise pas. Le personnage sera affiché au milieu de la vue.la source