Mesurer la largeur du texte à dessiner sur Canvas (Android)

129

Existe-t-il une méthode qui renvoie la largeur (en pixels) d'un texte à dessiner sur un canevas Android en utilisant la méthode drawText () en fonction du Paint utilisé pour le dessiner?

NioX5199
la source

Réponses:

224

Avez-vous regardé android.graphics.Paint.measureText (String txt) ?

Marc Bernstein
la source
20
Merci c'est ça! Je ne sais pas pourquoi je l'ai sauté. Le but était simplement de dessiner un texte au centre de l'écran. Quoi qu'il en soit, je viens de réaliser que j'aurais pu aussi simplement utiliser setTextAlign (Align.CENTER) sur le Paint utilisé pour dessiner le texte, il déplace l'origine spécifiée vers le centre du texte dessiné. Merci.
NioX5199
2
Génial, merci, définissez Aligner sur la peinture! qui aurait pensé à ça ...?
Sanjay Manohar
ou vous pouvez définir la gravité de la vue de texte sur Centre
yeradis
32
Paint paint = new Paint();
Rect bounds = new Rect();

int text_height = 0;
int text_width = 0;

paint.setTypeface(Typeface.DEFAULT);// your preference here
paint.setTextSize(25);// have this the same as your text size

String text = "Some random text";

paint.getTextBounds(text, 0, text.length(), bounds);

text_height =  bounds.height();
text_width =  bounds.width();
hamid reza zavareh
la source
12

Réponse complémentaire

Il existe une légère différence entre la largeur renvoyée par Paint.measureTextet Paint.getTextBounds. measureTextrenvoie une largeur qui inclut la valeur advanceX du glyphe remplissant le début et la fin de la chaîne. La Rectlargeur renvoyée par getTextBoundsn'a pas ce remplissage car les limites sont celles Rectqui enveloppent étroitement le texte.

la source

Suragch
la source
2

Il existe en fait trois façons différentes de mesurer le texte.

GetTextBounds:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
paint.getTextBounds(contents, 0, 1, rect)
val width = rect.width()

MeasureTextWidth:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val width = paint.measureText(contents, 0, 1)

Et getTextWidths:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
val arry = FloatArray(contents.length)
paint.getTextBounds(contents, 0, contents.length, rect)
paint.getTextWidths(contents, 0, contents.length, arry)
val width = ary.sum()

Notez que getTextWidths peut être utile si vous essayez de déterminer quand placer le texte à la ligne suivante.

MesureTextWidth et getTextWidth sont égaux et ont la largeur avancée qui mesure que d'autres ont publiée. Certains considèrent cet espace excessif. Cependant, cela est très subjectif et dépend de la police.

Par exemple, la largeur des limites du texte de mesure peut en fait paraître trop petite:

mesurer les limites du texte semble petit

Cependant, lors de l'ajout d'un texte supplémentaire, les limites d'une lettre semblent normales: mesurer les limites du texte semble normal pour les chaînes

Images extraites du Guide des développeurs Android pour le dessin de toile personnalisé

Jim Baca
la source
1

Eh bien, j'ai fait de manière différente:

String finalVal ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(40);
Typeface typeface = Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
paint.setTypeface(typeface);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

Rect result = new Rect();
paint.getTextBounds(finalVal, 0, finalVal.length(), result);

Log.i("Text dimensions", "Width: "+result.width()+"-Height: "+result.height());

J'espère que ceci vous aidera.

Hiren Patel
la source
0

J'ai utilisé les méthodes measureText () et getTextPath () + computeBounds () et j'ai construit un Excel avec tous les attributs de texte pour une police de taille fixe que l'on peut trouver sous https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Vous y trouverez également des formules simples pour d'autres attributs de texte tels que monter, etc.

L' application ainsi que la fonction drawFontTest () pour générer les valeurs brutes utilisées dans Excel sont également disponibles dans ce référentiel.

Armin J.
la source
0

vous pouvez utiliser "textPaint.getTextSize ()" pour obtenir la largeur du texte

Ashish John
la source