Я хотел бы получить высоту, если это возможно.
Как получить ширину строки на 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();
Ответ 2
Если вам нужна только ширина, которую вы можете использовать:
float width = paint.measureText(string);
http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)
Ответ 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)
, однако в редких случаях кажется более точным.