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

129

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

NioX5199
fuente

Respuestas:

224

¿Has mirado android.graphics.Paint.measureText (String txt) ?

Marc Bernstein
fuente
20
Gracias esto es todo! 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 di cuenta de que también podría haber usado setTextAlign (Align.CENTER) en la pintura utilizada para dibujar el texto, desplaza el origen especificado al centro del texto dibujado. Gracias.
NioX5199
2
Genial, gracias, configurar Alinear en la pintura! ¿Quién hubiera pensado en eso ...?
Sanjay Manohar
o puede establecer la Gravedad de la vista de texto en Centro
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
fuente
12

Respuesta suplementaria

Hay una ligera diferencia entre el ancho devuelto por Paint.measureTexty Paint.getTextBounds. measureTextdevuelve un ancho que incluye el valor advanceX del glifo rellenando el principio y el final de la cadena. El Rectancho devuelto por getTextBoundsno tiene este relleno porque los límites son los Rectque ajustan firmemente el texto.

fuente

Suragch
fuente
2

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

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)

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.

MeasureTextWidth y getTextWidth son iguales y tienen el ancho avanzado que miden sobre el que otros han publicado. Algunos consideran que este espacio es 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 parece 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 la Guía de desarrolladores de Android para el dibujo de lienzo personalizado

Jim Baca
fuente
1

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á.

Hiren Patel
fuente
0

Usé los métodos measureText () y getTextPath () + computeBounds () y construí un Excel con todos los atributos de texto para la fuente de tamaño fijo que se puede 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.

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

Armin J.
fuente
0

puedes usar "textPaint.getTextSize ()" para obtener el ancho del texto

Ashish John
fuente