Как получить ширину строки на Android?

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

Ответ 1

Вы можете использовать метод 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();

Ответ 3

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

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

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

Ответ 4

Я измерил ширину таким образом:

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

Это поможет вам.

Ответ 5

Скорее всего, вы хотите знать, нарисованные размеры для заданной строки текста с заданным шрифтом (т.е. конкретного Typeface, такие как "без засечек" семейство шрифтов с стиле BOLD_ITALIC и определенного размера в зр или рх).

Вместо раздувания полноценного 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, в котором вы StaticLayout ширину и StaticLayout высоту. Для очень сложного ответа об измерении и рисовании текста на холсте в пользовательском представлении, сделав это, смотрите: fooobar.com/questions/22797/...

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

Ответ 6

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

StaticLayout.getDesiredWidth(text, textPaint))

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

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