Medindo a largura do texto a ser desenhado no Canvas (Android)

129

Existe um método que retorna a largura (em pixels) de um texto a ser desenhado em uma tela do Android usando o método drawText () de acordo com o Paint usado para desenhá-lo?

NioX5199
fonte

Respostas:

224

Você já olhou para android.graphics.Paint.measureText (String txt) ?

Marc Bernstein
fonte
20
Graças a isso é isso! Não sei por que ignorei. O objetivo era simplesmente desenhar um texto no centro da tela. De qualquer forma, acabei de perceber que também poderia ter usado setTextAlign (Align.CENTER) no Paint usado para desenhar o texto, ele muda a origem especificada para o centro do texto desenhado. Obrigado.
NioX5199
2
Ótimo, obrigado, definindo Alinhar no Paint! quem teria pensado nisso ...?
Sanjay Manohar
ou você pode definir a gravidade da textview ao 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
fonte
12

Resposta complementar

Há uma pequena diferença entre a largura retornada por Paint.measureTexte Paint.getTextBounds. measureTextretorna uma largura que inclui o valor advanceX do glifo preenchendo o início e o final da string. A Rectlargura retornada por getTextBoundsnão possui esse preenchimento porque os limites são os Rectque envolvem firmemente o texto.

fonte

Suragch
fonte
2

Na verdade, existem três maneiras diferentes de medir o 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)

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

Observe que getTextWidths pode ser útil se você estiver tentando determinar quando quebrar o texto na próxima linha.

O measureTextWidth e getTextWidth são iguais e têm a largura avançada que mede sobre a qual outros postaram. Alguns consideram esse espaço excessivo. No entanto, isso é muito subjetivo e depende da fonte.

Por exemplo, a largura dos limites do texto da medida pode parecer muito pequena:

medir os limites do texto parece pequeno

No entanto, ao adicionar um texto adicional, os limites para uma letra parecem normais: medir os limites do texto parece normal para seqüências de caracteres

Imagens tiradas do Android Developers Guide to Custom Canvas Drawing

Jim Baca
fonte
1

Bem, eu fiz de maneira diferente:

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 isso ajude você.

Hiren Patel
fonte
0

Usei os métodos measureText () e getTextPath () + computeBounds () e criei um Excel com todos os atributos de texto para fontes de tamanho fixo que podem ser encontradas em https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Lá você também encontrará fórmulas simples para outros atributos de texto, como ascender etc.

O aplicativo e a função drawFontTest () para gerar os valores brutos usados ​​no Excel também estão disponíveis neste repositório.

Armin J.
fonte
0

você pode usar "textPaint.getTextSize ()" para obter a largura do texto

Ashish John
fonte