Misurare la larghezza del testo da disegnare su Canvas (Android)


129

Esiste un metodo che restituisce la larghezza (in pixel) di un testo da disegnare su una tela Android usando il metodo drawText () secondo il Paint usato per disegnarlo?

Risposte:


224

20
Grazie, eccolo! Non so perché l'ho saltato. Lo scopo era semplicemente disegnare un testo al centro dello schermo. Ad ogni modo mi sono appena reso conto che avrei potuto usare anche setTextAlign (Align.CENTER) sul Paint usato per disegnare il testo, sposta l'origine specificata al centro del testo disegnato. Grazie.
NioX5199,

2
Fantastico, grazie, impostare Allinea su Paint! chi ci avrebbe pensato ...?
Sanjay Manohar,

oppure puoi impostare Gravity of the textview su Center
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();

12

Risposta supplementare

C'è una leggera differenza tra la larghezza restituita da Paint.measureTexte Paint.getTextBounds. measureTextrestituisce una larghezza che include il valore di avanzamento del glifo che riempie l'inizio e la fine della stringa. La Rectlarghezza restituita da getTextBoundsnon ha questa spaziatura poiché i limiti sono quelli Rectche avvolgono strettamente il testo.

fonte


2

Esistono in realtà tre modi diversi di misurare il testo.

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

Nota che getTextWidths potrebbe essere utile se stai cercando di determinare quando avvolgere il testo nella riga successiva.

MeasureTextWidth e getTextWidth sono uguali e hanno la larghezza avanzata che misura di cui altri hanno postato. Alcuni considerano questo spazio eccessivo. Tuttavia, questo è molto soggettivo e dipende dal carattere.

Ad esempio, la larghezza dai limiti del testo della misura potrebbe effettivamente sembrare troppo piccola:

misurare i limiti del testo sembra piccolo

Tuttavia, quando si aggiunge un testo aggiuntivo, i limiti per una lettera sembrano normali: misurare i limiti del testo sembra normale per le stringhe

Immagini tratte dalla Guida per sviluppatori Android al disegno su tela personalizzato


1

Bene, ho fatto in modo diverso:

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

Spero che questo ti possa aiutare.



0

puoi usare "textPaint.getTextSize ()" per ottenere la larghezza del testo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.