ti-enxame.com

Como obter a largura da string no Android?

Gostaria de obter altura também, se possível.

92
Mikael Lindlöf

Você pode usar o método getTextBounds(String text, int start, int end, Rect bounds) de um objeto Paint. Você pode usar o objeto Paint fornecido por um TextView ou criar um você mesmo com a aparência de texto desejada.

Usando um Textview, você pode fazer o seguinte:

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

Se você só precisa da largura, pode usar:

float width = Paint.measureText(string);

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

71
SharkAlley

Existem duas medidas de largura diferentes para um texto. Um é o número de pixels desenhados na largura, o outro é o número de 'pixels' em que o cursor deve avançar após desenhar o texto.

Paint.measureText e Paint.getTextWidths retorna o número de pixels (em float), que o cursor deve avançar depois de desenhar a string especificada. Para o número de pixels pintados, use Paint.getTextBounds, conforme mencionado em outra resposta. Eu acredito que isso é chamado de 'Avanço' da fonte.

Para algumas fontes, essas duas medidas diferem (muito), por exemplo, a fonte Chancelaria Negra tem letras que se estendem além das outras letras (sobreposição) - veja a letra L (maiúscula). Use Paint.getTextBounds conforme mencionado em outra resposta para obter pixels pintados.

18
arberg

Eu medi a largura desta maneira:

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

Isso ajudaria você.

5
Hiren Patel

Provavelmente, você deseja conhecer as dimensões pintadas para uma determinada sequência de texto com uma fonte específica (ou seja, uma determinada Typeface , como a família de fontes "sans-serif" com um estilo BOLD_ITALIC e tamanho específico em sp ou px).

Em vez de inflar um TextView completo, você pode ir para um nível inferior e trabalhar com um objeto Paint diretamente para linha única texto, por exemplo:

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

Para texto de várias linhas ou estendido (SpannedString), considere usar um StaticLayout, no qual você fornece a largura e deriva a altura. Para obter uma resposta muito elaborada sobre como medir e desenhar texto em uma tela em uma visualização personalizada, consulte: https://stackoverflow.com/a/41779935/954643

Também vale a pena observar a resposta de @ arberg abaixo sobre os pixels pintados versus a largura do avanço ("número de pixels (em float)) que o cursor deve avançar depois de desenhar a sequência especificada"), caso você precise lidar com isso.

1
qix

Eu gostaria de compartilhar uma maneira melhor (mais versátil que a resposta atualmente aceita) para obter a largura exata de um texto desenhado (String) com o uso da classe estática StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

esse método é mais preciso que textView.getTextBounds(), pois é possível calcular a largura de uma única linha em uma multilinha TextView, ou você não pode usar TextView para começar (por exemplo, em um View implementação).

Dessa maneira, é semelhante a textPaint.measureText(text), porém parece ser mais preciso em casos raros.

1
Serj Ardovic