Есть ли метод, который возвращает ширину (в пикселях) текста, который будет нарисован на холсте Android, используя метод drawText() в соответствии с Paint, используемым для его рисования?
Измерение ширины текста на Canvas (Android)
Ответ 1
Вы посмотрели android.graphics.Paint.measureText(String txt)?
Ответ 2
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();
Ответ 3
Дополнительный ответ
Существует небольшая разница между шириной, возвращаемой Paint.measureText
и Paint.getTextBounds
. measureText
возвращает ширину, которая включает значение глифа advanceX, дополняющее начало и конец строки. Ширина Rect
, возвращаемая getTextBounds
, не имеет этого отступа, потому что границы - это Rect
, который плотно оборачивает текст.
Ответ 4
Ну, я сделал по-другому:
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());
Надеюсь, это поможет вам.
Ответ 5
Там на самом деле три разных способа измерения текста.
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 по пользовательскому рисованию на холсте
Ответ 6
Я использовал методы measureText() и getTextPath() + computeBounds() и создавал Excel со всеми текстовыми атрибутами для шрифта фиксированного размера, которые можно найти в https://github.com/ArminJo/android-blue-display/blob/master/TextWidth.xlsx. Там вы найдете также простые формулы для других атрибутов текста, таких как ascend и т.д.
app, а также функция drawFontTest() для генерации необработанных значений, используемых в excel, также доступны в этом репо.
Ответ 7
вы можете использовать "textPaint.getTextSize()", чтобы получить ширину текста