Відповіді:
Ви подивилися на android.graphics.Paint.measureText (String txt) ?
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();
Довідкова відповідь
Існує незначна різниця між шириною, повернутою на Paint.measureText
і Paint.getTextBounds
. measureText
повертає ширину, що включає значення AdvaXX глифа, додаючи початок і кінець рядка. Rect
Ширина повертається getTextBounds
не має такої відступ , тому що кордони є , Rect
що щільно обертає текст.
Насправді існує три різних способи вимірювання тексту.
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 може бути корисним, якщо ви намагаєтеся визначити, коли перевести текст у наступний рядок.
МіраTextWidth і getTextWidth рівні і мають розширену ширину, яка вимірює, про яку розмістили інші. Деякі вважають цей простір надмірним. Однак це дуже суб’єктивно і залежить від шрифту.
Наприклад, ширина від меж тексту може бути занадто маленькою:
Однак при додаванні додаткового тексту межі однієї літери виглядають нормально:
Зображення, взяті з Посібника для розробників Android для малювання на кантах на замовлення
Ну я зробив по-іншому:
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());
Сподіваюся, що це вам допоможе.
Я використав методи мераText () та getTextPath () + computeBounds () та створив Excel з усіма текстовими атрибутами для шрифту фіксованого розміру, який можна знайти за адресою https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Там ви знайдете і прості формули для інших текстових атрибутів, таких як підйом тощо.
Додаток , а також функція drawFontTest () для генерації вихідних значень , використовуваних в Excel, також доступні в цьому репо.