Messen der Textbreite, die auf Leinwand gezeichnet werden soll (Android)

Lesezeit: 3 Minuten

Benutzer-Avatar
NioX5199

Gibt es eine Methode, die die Breite (in Pixel) eines Textes zurückgibt, der auf einer Android-Leinwand gezeichnet werden soll, indem die Methode drawText() entsprechend dem zum Zeichnen verwendeten Paint verwendet wird?

Benutzer-Avatar
Markus Bernstein

Hast Du Dir angesehen android.graphics.Paint#messText(String txt)?

  • Danke das ist es! Ich weiß nicht, warum ich es übersprungen habe. Der Zweck bestand darin, einfach einen Text in der Mitte des Bildschirms zu zeichnen. Wie auch immer, mir wurde gerade klar, dass ich auch einfach setTextAlign(Align.CENTER) für die zum Zeichnen des Textes verwendete Farbe hätte verwenden können, es verschiebt den angegebenen Ursprung in die Mitte des gezeichneten Textes. Vielen Dank.

    – NioX5199

    15. Juli 2010 um 16:17 Uhr

  • Großartig, danke, Ausrichtung auf Farbe einstellen! wer hätte das gedacht…?

    – Sanjay Manohar

    5. August 2011 um 2:22 Uhr

  • oder Sie können die Schwerkraft der Textansicht auf Mitte setzen

    – Yeradis

    21. Oktober 2011 um 14:38 Uhr

Benutzer-Avatar
Hamid Reza Zavareh

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

Benutzer-Avatar
Suragch

Ergänzende Antwort

Es gibt einen kleinen Unterschied zwischen der von zurückgegebenen Breite Paint.measureText und Paint.getTextBounds. measureText gibt eine Breite zurück, die den advanceX-Wert der Glyphe enthält und den Anfang und das Ende der Zeichenfolge auffüllt. Das Rect Breite zurückgegeben von getTextBounds hat diese Polsterung nicht, weil das die Grenzen ist Rect die den Text fest umschließt.

Quelle

Es gibt eigentlich 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()

Textbreite messen:

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 nützlich sein kann, wenn Sie versuchen zu bestimmen, 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. Manche halten diesen Platz für übertrieben. Dies ist jedoch sehr subjektiv und abhängig von der Schriftart.

Beispielsweise kann die Breite der 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:
Textgrenzen messen sieht für Strings normal aus

Bilder entnommen aus Android-Entwicklerhandbuch zum benutzerdefinierten Canvas-Zeichnen

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

Ich hoffe, das wird Ihnen helfen.

Benutzer-Avatar
Armin J.

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 zu finden sind https://github.com/ArminJo/android-blue-display/blob/master/TextWidth.xlsx . Dort finden Sie auch einfache Formeln für andere Textattribute wie aufsteigend etc.

Das App sowie die Funktion drawFontTest() zur Generierung der in Excel verwendeten Rohwerte sind ebenfalls in diesem Repo verfügbar.

Benutzer-Avatar
Asch John

Sie können “textPaint.getTextSize()” verwenden, um die Textbreite zu erhalten

1338050cookie-checkMessen der Textbreite, die auf Leinwand gezeichnet werden soll (Android)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy