2011-06-03 17 views
17

Así que utilizo el método measureText() de Paint para medir el ancho de un segmento de texto, pero quería medir el texto según un determinado tamaño de texto. Digamos que quería obtener el ancho de un segmento de texto que tendrá 20 píxeles escalados cuando ocupa un cierto TextView. Intenté lo siguiente:android: measureText() Devuelve píxeles basados ​​en píxeles escalados

Paint paint = new Paint(); 
paint.setTextSize(20); 
paint.measureText("sample text"); 

Sin embargo, parece que no funciona. Creo que devuelve un ancho con respecto a un tamaño de texto más pequeño. Siento que me estoy perdiendo algo que me hará golpearme en la cara y gritar herp derp.

Respuesta

38

que necesita para obtener la densityMultiplier así:

final float densityMultiplier = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * densityMultiplier; 
paint.setTextSize(scaledPx); 
final float size = paint.measureText("sample text"); 
+0

¡Muchas gracias! Tenía la impresión de que el parámetro de setTextSize ya estaba en píxeles escalados, por lo que me confundí con dónde me estaba yendo mal. Funciona bien ahora :-) – Vinay

+0

no funciona para mí, tengo la vista de texto establecida en 20sp y ejecutando este código el tamaño me da algo más pequeño que el esperado – schwiz

+0

Compruebe la preferencia de tamaño de fuente: sp Píxeles independientes de escala: esto es como la unidad dp, pero también se escala según la preferencia de tamaño de fuente del usuario. Se recomienda utilizar esta unidad cuando se especifiquen los tamaños de fuente, para que se ajusten tanto para la densidad de la pantalla como para las preferencias del usuario. –

1

Hago algo como esto cuando tengo que hacerlo.

int textSize = 20; 
for(int i = 2; i<18 && curTextSize< textSize;i+=2) 
{ 
    this.label.setTextSize(i); 
    curTextSize = this.label.getPaint().measureText(this.label.getText().toString()); 
} 
-1

Trate

Paint.SetLinearText(true) 

que solucionó el problema para mí.

0

no tener suficientes puntos de reputación para comentar sobre las respuestas pero en referencia a los comentarios de @schwiz y @AndreasEK en la respuesta aceptada:

measureText(), junto con getTextBounds(), no incluyen alineado por lo que es posible que la solución a su problema es agregar el relleno izquierdo y derecho (o el relleno inicial y final)

final float scaleFactor = getContext().getResources().getDisplayMetrics().density; 
final float scaledPx = 20 * scaleFactor; 
paint.setTextSize(scaledPx); 
final float padding = scaleFactor * (textView.getPaddingStart() + textView.getPaddingEnd()); 
final float size = paint.measureText("sample text") + padding;