Czy istnieje metoda, która zwraca szerokość (w pikselach) tekstu do narysowania na kanwie systemu Android za pomocą metody drawText () zgodnie z narzędziem Paint użytym do jego narysowania?
android
text
android-canvas
draw
NioX5199
źródło
źródło
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();
źródło
Dodatkowa odpowiedź
Istnieje niewielka różnica między szerokością zwracaną przez
Paint.measureText
iPaint.getTextBounds
.measureText
zwraca szerokość, która zawiera wartość argumentu przed X glifu, wypełniającą początek i koniec łańcucha.Rect
Szerokość zwracane przezgetTextBounds
nie ma tego wyściółkę ponieważ granice toRect
że szczelnie zawija tekst.źródło
źródło
W rzeczywistości istnieją trzy różne sposoby mierzenia tekstu.
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)
I 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()
Zauważ, że getTextWidths może być przydatne, jeśli próbujesz określić, kiedy zawijać tekst do następnej linii.
MeasureTextWidth i getTextWidth są równe i mają zaawansowaną szerokość, o której pisali inni. Niektórzy uważają tę przestrzeń za nadmierną. Jest to jednak bardzo subiektywne i zależne od czcionki.
Na przykład szerokość od granic tekstu miary może faktycznie wyglądać na zbyt małą:
Jednak podczas dodawania dodatkowego tekstu granice jednej litery wyglądają normalnie:
Obrazy zaczerpnięte z przewodnika dla programistów Androida po niestandardowym rysowaniu płótna
źródło
Cóż, zrobiłem w inny sposób:
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());
Mam nadzieję, że to ci pomoże.
źródło
Użyłem metod MeasureText () i getTextPath () + computeBounds () i zbudowałem Excela ze wszystkimi atrybutami tekstu dla czcionki o stałym rozmiarze, które można znaleźć pod https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Znajdziesz tam również proste formuły dla innych atrybutów tekstu, takich jak wznoszenie itp.
Aplikacja , jak również funkcja drawFontTest () do generowania wartości surowców wykorzystywanych w programie Excel są dostępne również w tym repo.
źródło
możesz użyć "textPaint.getTextSize ()", aby uzyskać szerokość tekstu
źródło