Messen der Textbreite zum Zeichnen auf Leinwand (Android)

129

Gibt es eine Methode, die die Breite (in Pixel) eines auf einer Android-Zeichenfläche zu zeichnenden Textes mit der drawText () -Methode gemäß der zum Zeichnen verwendeten Farbe zurückgibt?

NioX5199
quelle

Antworten:

224

Haben Sie sich android.graphics.Paint.measureText (String txt) angesehen ?

Marc Bernstein
quelle
20
Danke das ist es! Ich weiß nicht, warum ich es übersprungen habe. Der Zweck bestand darin, einfach einen Text in die Mitte des Bildschirms zu zeichnen. Wie auch immer, ich habe gerade festgestellt, dass ich auch setTextAlign (Align.CENTER) für die Farbe verwenden könnte, mit der der Text gezeichnet wird. Dadurch wird der angegebene Ursprung in die Mitte des gezeichneten Textes verschoben. Vielen Dank.
NioX5199
2
Großartig, danke, Align auf die Farbe setzen! wer hätte daran gedacht ...?
Sanjay Manohar
oder Sie können die Schwerkraft der Textansicht auf Mitte setzen
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
quelle
12

Ergänzende Antwort

Es gibt einen kleinen Unterschied zwischen der von Paint.measureTextund zurückgegebenen Breite Paint.getTextBounds. measureTextGibt eine Breite zurück, die den Wert adv_X des Glyphen enthält, der den Anfang und das Ende der Zeichenfolge auffüllt. Die von zurückgegebene RectBreite getTextBoundshat diese Auffüllung nicht, da die Grenzen Rectden Text eng umschließen.

Quelle

Suragch
quelle
2

Es gibt tatsächlich drei verschiedene Möglichkeiten, Text zu messen.

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)

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

Beachten Sie, dass getTextWidths hilfreich sein kann, wenn Sie festlegen möchten, wann Text in die nächste Zeile umgebrochen werden soll.

MeasureTextWidth und getTextWidth sind gleich und haben die erweiterte Breite, über die andere gepostet haben. Einige halten diesen Raum für übermäßig. Dies ist jedoch sehr subjektiv und abhängig von der Schriftart.

Beispielsweise kann die Breite von Maßtextgrenzen tatsächlich zu klein aussehen:

Textgrenzen messen sieht klein aus

Wenn Sie jedoch einen zusätzlichen Text hinzufügen, sehen die Grenzen für einen Buchstaben normal aus: Das Messen von Textgrenzen sieht für Zeichenfolgen normal aus

Bilder aus dem Android Developers Guide für benutzerdefinierte Leinwandzeichnungen

Jim Baca
quelle
1

Nun, ich habe es anders gemacht:

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

Hoffe das wird dir helfen.

Hiren Patel
quelle
0

Ich habe die Methoden MeasureText () und getTextPath () + computeBounds () verwendet und ein Excel mit allen Textattributen für Schriftarten mit fester Größe erstellt, die unter https://github.com/ArminJo/android-blue-display/blob zu finden sind /master/TextWidth.xlsx . Dort finden Sie auch einfache Formeln für andere Textattribute wie Aufstieg usw.

Die App sowie die Funktion drawFontTest () zum Generieren der im Excel verwendeten Rohwerte sind ebenfalls in diesem Repo verfügbar.

Armin J.
quelle
0

Sie können "textPaint.getTextSize ()" verwenden, um die Textbreite abzurufen

Ashish John
quelle