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


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

5 82

5 ответов:

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

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

float width = paint.measureText(string);

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

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

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

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

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

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

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

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