Eu gostaria de obter altura também, se possível.
Eu gostaria de obter altura também, se possível.
Respostas:
Você pode usar o getTextBounds(String text, int start, int end, Rect bounds)
método de um objeto do Paint. Você pode usar o objeto de pintura fornecido por um TextView
ou construir 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();
textView.setTextSize()
.
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)
TextPaint paint = new TextPaint(); paint.setTextSize(textSize);
. textSize
está em pixels.
Existem duas medidas de largura diferentes para um texto. Um é o número de pixels que foi desenhado na largura, o outro é o número de 'pixels' 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 após desenhar a string dada. 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 Black Chancery tem letras que se estendem além das outras letras (sobrepostas) - veja o 'L' maiúsculo. Use paint.getTextBounds conforme mencionado em outra resposta para obter os pixels pintados.
Eu medi a largura desta forma:
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ê.
Muito provavelmente você deseja saber as dimensões pintadas para uma determinada sequência de texto com uma determinada fonte (ou seja, uma Typeface
família de fontes “sans-serif” com um estilo BOLD_ITALIC e tamanho específico em sp ou px).
Em vez de inflar totalmente TextView
, você pode ir para um nível mais baixo e trabalhar com um Paint
objeto diretamente para texto de uma linha , 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 multi-linhas ou estendido ( SpannedString
), considere usar um StaticLayout
, em que você fornece a largura e obtém a altura. Para obter uma resposta muito elaborada sobre como medir e desenhar texto em uma tela em uma visualização personalizada fazendo isso, consulte: https://stackoverflow.com/a/41779935/954643
Também vale a pena notar a resposta de @arberg abaixo sobre os pixels pintados vs a largura de avanço ("número de pixels (em float) que o cursor deve ser avançado após desenhar a string dada"), caso você precise lidar com isso.
Eu gostaria de compartilhar uma maneira melhor (mais versátil do que a resposta aceita atualmente) de obter a largura exata de um texto desenhado ( String
) com o uso de classe estática StaticLayout
:
StaticLayout.getDesiredWidth(text, textPaint))
este método é mais preciso do que textView.getTextBounds()
, uma vez que você pode calcular a largura de uma única linha em uma multilinha TextView
, ou você pode não usar TextView
para começar (por exemplo, em uma View
implementação personalizada ).
Esta forma é semelhante textPaint.measureText(text)
, porém parece ser mais precisa em casos raros.