J'essaye d'afficher un texte en utilisant le code ci-dessous. Le problème est que le texte n'est pas centré horizontalement. Lorsque je règle les coordonnées pour drawText
, il définit le bas du texte à cette position. Je voudrais que le texte soit dessiné de sorte que le texte soit centré également horizontalement.
Voici une image pour afficher davantage mon problème:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Sébastien
la source
la source
Réponses:
Essayez ce qui suit:
la source
float halfLength = text.length() / 2f;
cela s'appelle la promotion de type .Paint.descent()
etPaint.ascent()
) avec l'approche pour centrer le textePaint.getTextBounds()
dans ma réponse ci-dessous.Paint.descent()
etPaint.ascent()
ne prennent pas en compte le texte actuel. (Vous pouvez reconnaître cette inexactitude dans la capture d'écran dans mon message ci-dessous.) C'est pourquoi je recommanderais de ne pas utiliser cette approche. L'approche avecPaint.getTextBounds()
semble fonctionner plus précise.Centrer avec Paint.getTextBounds () :
Paint.Align.CENTER ne signifie pas que le point de référence du texte est centré verticalement. Le point de référence est toujours sur la ligne de base. Alors, pourquoi ne pas utiliser Paint.Align.LEFT ? Vous devez quand même calculer le point de référence.
Paint.descent () a l'inconvénient de ne pas considérer le vrai texte. Paint.descent () récupère la même valeur, que le texte contienne ou non des lettres descendantes. C'est pourquoi j'utilise r.bottom à la place.
J'ai eu quelques problèmes avec Canvas.getHeight () si API <16. C'est pourquoi j'utilise plutôt Canvas.getClipBounds (Rect) . (N'utilisez pas Canvas.getClipBounds (). GetHeight () car il alloue de la mémoire pour un Rect .)
Pour des raisons de performances, vous devez allouer les objets avant qu'ils ne soient utilisés dans onDraw () . Comme drawCenter () sera appelé dans onDraw (), l'objet Rect r est préalloué comme champ ici.
J'ai essayé de mettre le code des deux principales réponses dans mon propre code (août 2015) et j'ai fait une capture d'écran pour comparer les résultats:
Le texte doit être centré dans le rectangle rempli de rouge. Mon code produit le texte blanc, les deux autres codes produisent tout à fait le texte gris (ils sont en fait les mêmes, se chevauchant). Le texte gris est un peu trop bas et deux beaucoup à droite.
Voici comment j'ai fait le test:
la source
Aligner verticalement est difficile car la descente et la remontée du texte se sont produites, beaucoup de gars ont utilisé Paint.getTextBounds () pour récupérer TextWidth et TextHeight, mais cela ne fait pas beaucoup le centre du texte. Ici, nous pouvons utiliser Paint.measureText () pour calculer le TextWidth, le TextHeight que nous faisons simplement en soustrayant avec la descente et l'ascension, puis nous avons le plus d'approche TextSize, le travail suivant est assez facile l'un pour l'autre.
À propos, nous recommandons fortement d'utiliser RectF plutôt que Rect car les positions nécessitent des valeurs plus précises.Dans mon expérience, RectF a fait la déviation haut et bas d'un seul pixel sur l'appareil xhdpi, Rect serait deux de plus.
la source
Votre code dessine le centre de la ligne de base du texte, au centre de la vue. Pour centrer le texte à un moment donné, x, y, vous devez calculer le centre du texte, et de mettre ce au point.
Cette méthode dessinera le texte centré au point x, y. Si vous lui passez le centre de votre vue, il dessinera le texte centré.
la source
android.graphics.Paint
être utilisé pour dessiner le texteJe trouve que la meilleure solution pour centrer le texte est la suivante:
la source
fonctionne pour moi d'utiliser: textPaint.textAlign = Paint.Align.CENTER avec textPaint.getTextBounds
le résultat est:
la source
Je crée une méthode pour simplifier cela:
rectF est la zone dans laquelle vous voulez dessiner le texte, c'est tout. Détails
la source
Si nous utilisons une disposition statique
Layout.Alignment.ALIGN_CENTER cela fera l'affaire. La disposition statique présente également de nombreux autres avantages.
Référence: Documentation Android
la source
Cela a fonctionné pour moi:
si quelqu'un trouve un problème, merci de me le faire savoir
la source
Dans mon cas, je n'ai pas eu à mettre le texte au milieu d'une toile, mais dans une roue qui tourne. Bien que j'ai dû utiliser ce code pour réussir:
Ensuite, j'appelle cette méthode à partir de la classe View:
la source