web-dev-qa-db-fra.com

Comment obtenir la largeur de chaîne sur Android?

J'aimerais aussi avoir de la hauteur si possible.

92
Mikael Lindlöf

Vous pouvez utiliser la méthode getTextBounds(String text, int start, int end, Rect bounds) d'un objet Paint. Vous pouvez utiliser l’objet Paint fourni par un TextView ou en créer un vous-même avec l’apparence souhaitée.

En utilisant un TextView, vous pouvez effectuer les opérations suivantes:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();
190
Frank

Si vous avez juste besoin de la largeur, vous pouvez utiliser:

float width = Paint.measureText(string);

http://developer.Android.com/reference/Android/graphics/Paint.html#measureText (Java.lang.String)

71
SharkAlley

Il existe deux mesures de largeur différentes pour un texte. Le premier est le nombre de pixels dessinés dans la largeur, le second est le nombre de "pixels" à utiliser pour faire avancer le curseur après le tracé du texte.

Paint.measureText et Paint.getTextWidths renvoie le nombre de pixels (en float) que le curseur doit être avancé après avoir tracé la chaîne donnée. Pour le nombre de pixels peints, utilisez Paint.getTextBounds comme indiqué dans une autre réponse. Je crois que cela s'appelle le "Advance" de la police.

Pour certaines polices, ces deux mesures diffèrent (beaucoup), par exemple, la police Black Chancery possède des lettres qui dépassent les autres (chevauchement) - voir la majuscule 'L'. Utilisez Paint.getTextBounds comme indiqué dans une autre réponse pour obtenir des pixels peints.

18
arberg

J'ai mesuré la largeur de cette façon:

String str ="Hiren Patel";

Paint paint = new Paint();
Paint.setTextSize(20);
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(str, 0, str.length(), result);

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

Cela vous aiderait.

5
Hiren Patel

Très probablement, vous voulez connaître les dimensions peintes pour une chaîne de texte donnée avec une police donnée (c'est-à-dire un Typeface tel que la famille de polices "sans-serif" avec un style BOLD_ITALIC , et taille particulière en sp ou px).

Plutôt que de gonfler un TextView complet, vous pouvez aller plus bas et utiliser un objet Paint directement pour single- texte de ligne , par exemple:

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();

// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont); 
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
Paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spSize,
            context.getResources().getDisplayMetrics());
Paint.setTextSize(scaledSizeInPixels);

// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
Paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());

Pour texte multiligne ou fractionné (SpannedString), envisagez d'utiliser un StaticLayout, dans lequel vous fournissez la largeur. et dériver la hauteur. Pour une réponse très élaborée sur la mesure et le tracé de texte sur un canevas dans une vue personnalisée, voir: https://stackoverflow.com/a/41779935/95464

Il convient également de noter la réponse de @ arberg ci-dessous concernant les pixels peints par rapport à la largeur d'avance ("nombre de pixels (en virgule flottante) que le curseur doit être avancé après avoir tracé la chaîne donnée"), au cas où vous auriez besoin de le gérer.

1
qix

J'aimerais partager un meilleur moyen (plus polyvalent que la réponse acceptée actuellement) d'obtenir la largeur exacte d'un texte dessiné (String) avec l'utilisation de la classe statique StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

cette méthode est plus précise que textView.getTextBounds(), car vous pouvez calculer la largeur d'une seule ligne dans un multiligne TextView, ou vous ne pouvez pas utiliser TextView pour commencer (par exemple dans une implémentation personnalisée View).

Cette méthode est similaire à textPaint.measureText(text), mais elle semble être plus précise dans de rares cas.

1
Serj Ardovic