Как получить ширину строки на Android? - PullRequest
90 голосов
/ 02 сентября 2010

Я бы тоже хотел получить рост, если это возможно.

Ответы [ 6 ]

188 голосов
/ 02 сентября 2010

Вы можете использовать метод getTextBounds(String text, int start, int end, Rect bounds) объекта Paint. Вы можете использовать объект рисования, предоставленный TextView, или создать его самостоятельно с желаемым видом текста.

Используя Textview, вы можете сделать следующее:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();
70 голосов
/ 17 июня 2012

Если вам нужна ширина, которую вы можете использовать:

float width = paint.measureText(string);

http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)

17 голосов
/ 13 августа 2013

Существует два разных значения ширины для текста.Один - это количество пикселей, которое было нарисовано по ширине, другое - количество «пикселей», на которые курсор должен двигаться после рисования текста.

paint.measureText и paint.getTextWidths возвращает количество пикселей (с плавающей запятой), на которое курсор должен перемещаться после рисования заданной строки.Для количества окрашенных пикселей используйте paint.getTextBounds, как указано в другом ответе.Я считаю, что это называется «продвижением» шрифта.

Для некоторых шрифтов эти два измерения различаются (много), например, шрифт Black Chancery имеет буквы, которые выходят за другие буквы(перекрытие) - см. заглавную букву «L».Используйте paint.getTextBounds , как упомянуто в другом ответе, чтобы получить пиксели нарисованными.

5 голосов
/ 09 декабря 2016

Я измерил ширину следующим образом:

String str ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(20);
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(str, 0, str.length(), result);

Log.i("Text dimensions", "Width: "+result.width());

Это тебе поможет.

1 голос
/ 05 августа 2018

Скорее всего, вы хотите знать нарисованные размеры для заданной строки текста с заданным шрифтом (то есть для конкретного Typeface, такого как семейство шрифтов «sans-serif» со стилем BOLD_ITALIC,и определенного размера в sp или px).

Вместо того, чтобы надувать полноценный TextView, вы можете перейти на более низкий уровень и работать с объектом Paint напрямую для однострочный текст, например:

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();

// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont); 
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spSize,
            context.getResources().getDisplayMetrics());
paint.setTextSize(scaledSizeInPixels);

// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());

Для многострочного или составного текста (SpannedString) рассмотрите возможность использования StaticLayout, в котором вы предоставляетеширина и вывести высоту.Для очень сложного ответа об измерении и рисовании текста на холсте в пользовательском представлении, сделав это, см .: https://stackoverflow.com/a/41779935/954643

Также стоит отметить ответ @ arberg ниже о пикселях, окрашенных по сравнению с шириной продвижения (msgstr "количество пикселей (в формате с плавающей запятой), на которое должен перемещаться курсор после прорисовки заданной строки"), если вам нужно с этим справиться.

0 голосов
/ 06 июня 2019

Я хотел бы поделиться лучшим способом (более универсальным, чем текущий принятый ответ) получения точной ширины нарисованного текста (String) с использованием статического класса StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

этот метод более точен, чем textView.getTextBounds(), так как вы можете вычислить ширину отдельной строки в мультилинии TextView или вы не можете использовать TextView для начала (например,в пользовательской реализации View).

Этот способ аналогичен textPaint.measureText(text), однако в редких случаях он представляется более точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...