Вимірювання ширини тексту для малювання на полотні (Android)


129

Чи існує метод, який повертає ширину (у пікселях) тексту для малювання на полотні Android, використовуючи метод drawText () відповідно до Paint, який використовується для його малювання?

Відповіді:


224

Ви подивилися на android.graphics.Paint.measureText (String txt) ?


20
Дякую, це все! Я не знаю, чому я пропустив це. Метою було просто намалювати текст у центрі екрану. У будь-якому випадку я щойно зрозумів, що міг би також використати setTextAlign (Align.CENTER) на Paint, який використовується для малювання тексту, він зміщує вказане походження на центр намальованого тексту. Дякую.
NioX5199

2
Чудово, спасибі, налаштування Вирівняти по фарбі! хто б міг подумати про це ...?
Санджай Манохар

або Ви можете встановити Гравітацію перегляду тексту в Центр
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повертає ширину, що включає значення AdvaXX глифа, додаючи початок і кінець рядка. 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 може бути корисним, якщо ви намагаєтеся визначити, коли перевести текст у наступний рядок.

МіраTextWidth і 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

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

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


0

ви можете використовувати "textPaint.getTextSize ()", щоб отримати ширину тексту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.