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


Ответы:


203

Вы можете использовать getTextBounds(String text, int start, int end, Rect bounds)метод объекта Paint. Вы можете использовать объект рисования, предоставленный a, 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();

5
@Frank: Что, если String является составной строкой?
Эшвин

Отличный ответ. Кстати, результат будет точнее, если позвонить textView.setTextSize().
li2

82

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

float width = paint.measureText(string);

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


5
Кроме того, если вы хотите измерить текст с определенным размером шрифта, вы можете использовать TextPaint paint = new TextPaint(); paint.setTextSize(textSize);. textSizeв пикселях.
Натан Релайн,

А для роста?
Prince

19

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

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

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


6

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

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

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


3

Скорее всего, вы хотите знать размеры, нарисованные для данной строки текста с заданным шрифтом (то есть конкретным шрифтом, 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 ниже о пикселях, нарисованных в зависимости от ширины продвижения («количество пикселей (в float), на которое курсор должен перемещаться после рисования данной строки»), на случай, если вам нужно с этим разобраться.


2

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

StaticLayout.getDesiredWidth(text, textPaint))

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.