Medición del ancho del texto que se dibujará en Canvas (Android)

3 minutos de lectura

avatar de usuario
NioX5199

¿Existe algún método que devuelva el ancho (en píxeles) de un texto que se dibujará en un lienzo de Android usando el método drawText() de acuerdo con la pintura utilizada para dibujarlo?

avatar de usuario
marc bernstein

has mirado android.graphics.Paint#measureText(String txt)?

  • Gracias esto es! No sé por qué me lo salté. El propósito era simplemente dibujar un texto en el centro de la pantalla. De todos modos, me acabo de dar cuenta de que también podría haber usado setTextAlign (Align.CENTER) en la pintura utilizada para dibujar el texto, cambia el origen especificado al centro del texto dibujado. Gracias.

    – NioX5199

    15 de julio de 2010 a las 16:17

  • ¡Genial, gracias, configurando Align en Paint! ¿Quién hubiera pensado en eso…?

    – Sanjay Manohar

    5 de agosto de 2011 a las 2:22

  • o puede establecer la Gravedad de la vista de texto en Centro

    – yeradis

    21 de octubre de 2011 a las 14:38

avatar de usuario
hamid reza zavareh

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();

avatar de usuario
Suragch

respuesta suplementaria

Hay una ligera diferencia entre el ancho devuelto por Paint.measureText y Paint.getTextBounds. measureText devuelve un ancho que incluye el valor advanceX del glifo rellenando el principio y el final de la cadena. los Rect ancho devuelto por getTextBounds no tiene este relleno porque los límites son los Rect que envuelve firmemente el texto.

fuente

En realidad, hay tres formas diferentes de medir el texto.

ObtenerLímites de Texto:

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()

MedirAnchoTexto:

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)

Y 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()

Tenga en cuenta que getTextWidths podría ser útil si está tratando de determinar cuándo ajustar el texto a la siguiente línea.

Las medidas MeasureTextWidth y getTextWidth son iguales y tienen el ancho avanzado que mide sobre lo que otros han publicado. Algunos consideran este espacio excesivo. Sin embargo, esto es muy subjetivo y depende de la fuente.

Por ejemplo, el ancho de los límites del texto de medida puede parecer demasiado pequeño:

medir los límites del texto se ve pequeño

Sin embargo, al agregar un texto adicional, los límites de una letra parecen normales:
medir los límites del texto parece normal para las cadenas

Imágenes tomadas de Guía para desarrolladores de Android sobre dibujos de lienzo personalizados

Bueno, lo he hecho de otra manera:

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());

Espero que esto te ayudará.

avatar de usuario
armin j

Utilicé los métodos MeasureText() y getTextPath()+computeBounds() y creé un Excel con todos los atributos de texto para fuentes de tamaño fijo que se pueden encontrar en https://github.com/ArminJo/android-blue-display/blob/master/TextWidth.xlsx . Allí encontrará también fórmulas simples para otros atributos de texto como ascender, etc.

los aplicación así como la función dibujarFuentePrueba() para generar los valores sin procesar utilizados en Excel también están disponibles en este repositorio.

avatar de usuario
Ashish John

puede usar “textPaint.getTextSize ()” para obtener el ancho del texto

¿Ha sido útil esta solución?