Я бы тоже хотел набрать рост, если возможно.
Я бы тоже хотел набрать рост, если возможно.
Ответы:
Вы можете использовать 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();
textView.setTextSize()
.
Если вам просто нужна ширина, вы можете использовать:
float width = paint.measureText(string);
http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)
TextPaint paint = new TextPaint(); paint.setTextSize(textSize);
. textSize
в пикселях.
Есть два разных размера ширины текста. Один - это количество пикселей, нарисованных по ширине, другой - количество «пикселей», на которые курсор должен перемещаться после рисования текста.
paint.measureText и paint.getTextWidths возвращают количество пикселей (в формате с плавающей запятой), на которое курсор должен переместиться после рисования данной строки. Для количества окрашенных пикселей используйте paint.getTextBounds, как указано в другом ответе. Я считаю, что это называется «продвижение» шрифта.
Для некоторых шрифтов эти два измерения различаются (много), например, в шрифте Black Chancery буквы выходят за другие буквы (перекрываются) - см. Заглавную букву «L». Используйте paint.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), на которое курсор должен перемещаться после рисования данной строки»), на случай, если вам нужно с этим разобраться.
Я хотел бы поделиться лучшим способом (более универсальным, чем текущий принятый ответ) получения точной ширины нарисованного текста ( String
) с использованием статического класса StaticLayout
:
StaticLayout.getDesiredWidth(text, textPaint))
этот метод более точен, чем textView.getTextBounds()
, поскольку вы можете рассчитать ширину отдельной строки в многострочном TextView
или не использовать TextView
для начала (например, в пользовательской View
реализации).
Этот способ похож на textPaint.measureText(text)
, но в редких случаях кажется более точным.