Pomiar szerokości tekstu do narysowania na płótnie (Android)


131

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?

Odpowiedzi:


229

21
Dzięki, to jest to! Nie wiem, dlaczego to pominąłem. Celem było po prostu narysowanie tekstu na środku ekranu. W każdym razie właśnie zdałem sobie sprawę, że mogłem po prostu użyć setTextAlign (Align.CENTER) na Paint używanym do rysowania tekstu, przesuwa określone źródło do środka narysowanego tekstu. Dzięki.
NioX5199

2
Świetnie, dzięki, ustawiam Wyrównaj na Farbie! kto by pomyślał o tym ...?
Sanjay Manohar,

lub możesz ustawić Gravity of the textview na Center
yeradis

34
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

Dodatkowa odpowiedź

Istnieje niewielka różnica między szerokością zwracaną przez Paint.measureTexti Paint.getTextBounds. measureTextzwraca szerokość, która zawiera wartość argumentu przed X glifu, wypełniającą początek i koniec łańcucha. RectSzerokość zwracane przez getTextBoundsnie ma tego wyściółkę ponieważ granice to Rectże szczelnie zawija tekst.

źródło


3

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łą:

miara granice tekstu wyglądają na małe

Jednak podczas dodawania dodatkowego tekstu granice jednej litery wyglądają normalnie: miara granic tekstu wygląda normalnie dla łańcuchów

Obrazy zaczerpnięte z przewodnika dla programistów Androida po niestandardowym rysowaniu płótna


1

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.


0

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.