it-swarm.com.de

Messen der Textbreite auf Leinwand (Android)

Gibt es eine Methode, die die Breite (in Pixel) eines Texts zurückgibt, der auf einer Android-Leinwand mit der drawText () -Methode gemäß dem zum Zeichnen verwendeten Paint gezeichnet werden soll?

115
NioX5199
199
Marc Bernstein
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();
27

Ergänzende Antwort

Es gibt einen geringfügigen Unterschied zwischen der von Paint.measureText und Paint.getTextBounds zurückgegebenen Breite. measureText gibt eine Breite zurück, die den advanceX-Wert der Glyphe enthält, der den Anfang und das Ende der Zeichenfolge auffüllt. Die von Rect zurückgegebene Breite von getTextBounds verfügt nicht über diese Auffüllung, da die Grenzen die Rect sind, die den Text fest umschließt.

Quelle

7
Suragch

Nun, ich habe es auf unterschiedliche Weise 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.

1
Hiren Patel

Tatsächlich gibt es 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 geschrieben haben. Einige halten diesen Platz für übermäßig. Dies ist jedoch sehr subjektiv und von der Schriftart abhängig.

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

measure text bounds looks small

Wenn Sie jedoch einen zusätzlichen Text hinzufügen, sehen die Grenzen für einen Buchstaben normal aus: measure text bounds looks normal for strings

Bilder aus Android-Entwicklerhandbuch für benutzerdefinierte Leinwandzeichnungen

0
Jim Baca

Ich verwendete die Methoden measureText () und getTextPath () + computeBounds () und baute ein Excel mit allen Textattributen für eine feste Schriftgröße auf, die unter https://github.com/ArminJo/Android-blue-display zu finden ist /blob/master/TextWidth.xlsx ..__ Hier finden Sie auch einfache Formeln für andere Textattribute wie ascend usw.

Die app sowie die Funktion drawFontTest () zum Generieren der in Excel verwendeten Rohwerte stehen auch in diesem Repo zur Verfügung.

0
Armin J.