Измерение ширины текста для рисования на холсте (Android)


129

Есть ли метод, который возвращает ширину (в пикселях) текста, который нужно нарисовать на холсте Android, с помощью метода drawText () в соответствии с Paint, использованным для его рисования?

Ответы:


224

20
Спасибо, вот оно! Не знаю, почему я это пропустил. Цель заключалась в том, чтобы просто нарисовать текст в центре экрана. В любом случае я только что понял, что мог бы просто использовать setTextAlign (Align.CENTER) в Paint, используемом для рисования текста, он сдвигает указанное начало координат в центр нарисованного текста. Спасибо.
NioX5199

2
Отлично, спасибо, установил Align на Paint! кто бы мог подумать об этом ...?
Санджай Манохар

или вы можете установить Gravity of textview в Center
yeradis

32
Paint paint = new Paint();
Rect bounds = new Rect();

int text_height = 0;
int text_width = 0;

paint.setTypeface(Typeface.DEFAULT);// your preference here
paint.setTextSize(25);// have this the same as your text size

String text = "Some random text";

paint.getTextBounds(text, 0, text.length(), bounds);

text_height =  bounds.height();
text_width =  bounds.width();

12

Дополнительный ответ

Есть небольшая разница между шириной, возвращаемой Paint.measureTextи Paint.getTextBounds. measureTextвозвращает ширину, которая включает значение advanceX глифа, заполняющее начало и конец строки. RectШирина возвращаемый getTextBoundsне имеет такой отступ , потому что границы является , Rectчто плотно оборачивает текст.

источник


2

На самом деле существует три разных способа измерения текста.

GetTextBounds:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
paint.getTextBounds(contents, 0, 1, rect)
val width = rect.width()

MeasureTextWidth:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val width = paint.measureText(contents, 0, 1)

И getTextWidths:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
val arry = FloatArray(contents.length)
paint.getTextBounds(contents, 0, contents.length, rect)
paint.getTextWidths(contents, 0, contents.length, arry)
val width = ary.sum()

Обратите внимание, что getTextWidths может быть полезен, если вы пытаетесь определить, когда переносить текст на следующую строку.

MeasureTextWidth и getTextWidth равны и имеют расширенную ширину, которая измеряет, о которой писали другие. Некоторые считают это пространство чрезмерным. Однако это очень субъективно и зависит от шрифта.

Например, ширина от границ текста меры может показаться слишком маленькой:

измерить границы текста выглядит маленьким

Однако при добавлении дополнительного текста границы для одной буквы выглядят нормально: границы текста измерения выглядят нормально для строк

Изображения взяты из руководства для разработчиков Android по пользовательскому отрисовке холста


1

Ну я сделал по другому:

String finalVal ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(40);
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(finalVal, 0, finalVal.length(), result);

Log.i("Text dimensions", "Width: "+result.width()+"-Height: "+result.height());

Надеюсь, что это поможет вам.


0

Я использовал методы measureText () и getTextPath () + computeBounds () и создал Excel со всеми текстовыми атрибутами для шрифта фиксированного размера, который можно найти в https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Там вы также найдете простые формулы для других текстовых атрибутов, таких как ascend и т. Д.

Приложение , а также функция drawFontTest () для генерации исходных значений , используемых в Excel, также доступны в этом репо.


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