Как получить ширину строки на Android?
Я хотел бы получить высоту тоже, если это возможно.
5 ответов:
можно использовать
getTextBounds(String text, int start, int end, Rect bounds)
метод объекта Paint. Вы можете использовать объект paint, поставляемый aTextView
или построить один самостоятельно с желаемым внешним видом текста.С помощью 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), которое курсор должен быть выдвинут после рисования данной строки"), в случае тебе нужно с этим разобраться.