web-dev-qa-db-fra.com

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

Existe-t-il une méthode qui renvoie la largeur (en pixels) d'un texte à dessiner sur une toile Android à l'aide de la méthode drawText () en fonction de la peinture utilisée pour le dessiner?

115
NioX5199
199
Marc Bernstein
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();
27
hamid reza zavareh

Réponse complémentaire

Il existe une légère différence entre la largeur renvoyée par Paint.measureText et Paint.getTextBounds . measureText renvoie une largeur qui inclut la valeur advanceX du glyphe, complétant le début et la fin de la chaîne. La largeur Rect renvoyée par getTextBounds n'a pas ce remplissage, car les bornes sont la Rect qui enveloppe le texte.

la source

7
Suragch

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.

1
Hiren Patel

Il y a en fait trois manières 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 insérer du texte à la ligne suivante.

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

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

measure text bounds looks small

Cependant, lors de l'ajout d'un texte supplémentaire, les limites d'une lettre semblent normales: measure text bounds looks normal for strings

Images issues de Guide du développeur Android pour le dessin sur toile personnalisé

0
Jim Baca

J'ai utilisé les méthodes measureText () et getTextPath () + computeBounds () et ai créé un Excel avec tous les attributs de texte pour une police de taille fixe qui se trouve 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 ascend, etc.

Le app ainsi que la fonction drawFontTest () permettant de générer les valeurs brutes utilisées dans Excel sont également disponibles dans ce référentiel.

0
Armin J.