Comment dessiner une chaîne centré verticalement dans Java?
Je sais que c'est un concept simple, mais j'ai du mal avec les mesures de police. Centrage à l'horizontale n'est pas trop dur, mais à la verticale semble un peu difficile.
J'ai essayé d'utiliser le FontMetrics getAscent, getLeading, getXXXX méthodes dans diverses combinaisons, mais peu importe ce que j'ai essayé le texte est toujours hors de quelques pixels. Est-il un moyen de mesurer la hauteur exacte du texte de sorte qu'il est parfaitement centré.
Vous devez vous connecter pour publier un commentaire.
Note, vous ne besoin d'examiner précisément ce que vous entendez par centrage vertical.
Polices sont rendus sur une base, la course le long de la partie inférieure du texte. L'espace vertical est réparti comme suit:
Le premier est tout simplement la police de l'espace recommandé entre les lignes. Pour des raisons de centrage à la verticale entre les deux points, vous devez ignorer leader (c'est ledding, BTW, pas leeding; en général, la typographie, il est/était le chef de l'espacement inséré entre les lignes dans une plaque d'impression).
Donc, pour centrer le texte des ascendantes et des descendantes, vous voulez le
Sans le final "+ ascension", vous avez la position pour la partie supérieure de la police; par conséquent, l'ajout de l'ascension du sommet à la base.
Aussi, notez que la hauteur de la police doit inclure la tête, mais certaines polices ne comprennent pas cela, et en raison de différences d'arrondi, la hauteur de la police ne peut pas exactement égale (leader + montée + descente).
J'ai trouvé une recette ici.
L'essentiel des méthodes semblent
getStringBounds()
etgetAscent()
(remarque: le code ci-dessus est couverte par les Licence MIT comme indiqué sur la page.)
Pas sûr que cela aide, mais
drawString(s, x, y)
définit la de base du texte à y.Je travaillais avec faire des centrage vertical et ne pouvait pas obtenir le texte de regarder à droite, jusqu'à ce que j'ai remarqué que le problème mentionné dans la documentation. J'ai été en supposant que le fond de la police a été à y.
Pour moi, la solution était de soustraire
fm.getDescent()
à partir de la coordonnée.Une autre option est le getBounds méthode de la TextLayout classe.