Як отримати ширину рядка на Android?


Відповіді:


201

Можна використовувати getTextBounds(String text, int start, int end, Rect bounds)метод об’єкта Paint. Ви можете або використовувати об’єкт фарби, який постачає постачальник, TextViewабо побудувати його з потрібним виглядом тексту.

За допомогою перегляду тексту можна зробити наступне:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();

5
@Frank: Що робити, якщо String - це натягнутий рядок?
Ешвін

Чудова відповідь. До речі, результат буде точнішим, якщо зателефонувати textView.setTextSize().
li2

81

Якщо вам просто потрібна ширина, ви можете використовувати:

float width = paint.measureText(string);

http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)


4
Крім того, якщо ви хочете виміряти текст за певним розміром шрифту, ви можете використовувати TextPaint paint = new TextPaint(); paint.setTextSize(textSize);. textSizeзнаходиться в пікселях.
Натан Рілін

А для отримання висоти?
Принц

19

Існує дві різні міри ширини для тексту. Одне - кількість пікселів, намальованих по ширині, а інше - кількість пікселів, якими курсор повинен бути розширений після нанесення тексту.

paint.measureText і paint.getTextWidths повертає кількість пікселів (у поплавці), які курсор повинен бути розширений після малювання заданого рядка. Для кількості намальованих пікселів використовуйте paint.getTextBounds, як зазначено в іншій відповіді. Я вважаю, що це називається "заздалегідь" шрифту.

У деяких шрифтах ці два вимірювання відрізняються (багато), наприклад, шрифт Black Chancery має літери, які проходять повз інші літери (перекриваються) - див. Велику літеру "L". Використовуйте paint.getTextBounds, як зазначено в іншій відповіді, щоб отримати пікселі фарбованими.


6

Я вимірював ширину таким чином:

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());

Це допомогло б вам.


3

Швидше за все, ви хочете дізнатись пофарбовані розміри для заданого рядка тексту із заданим шрифтом (наприклад, 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) розгляньте використання a StaticLayout, в якому ви вказуєте ширину та отримуєте висоту. Щоб отримати дуже детальну відповідь щодо вимірювання та малювання тексту на полотні в спеціальному режимі, див. Https://stackoverflow.com/a/41779935/954643

Також варто відзначити відповідь @ arberg нижче про пікселі, пофарбовані проти попередньої ширини ("кількість пікселів (у плавці), яку слід ввести курсором після нанесення даного рядка"), у разі якщо вам потрібно буде з цим впоратися.


2

Я хотів би поділитися кращим способом (більш універсальним, ніж поточна прийнята відповідь) отримання точної ширини намальованого тексту ( String) з використанням статичного класу StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

цей метод є більш точним textView.getTextBounds(), оскільки ви можете обчислити ширину одного рядка в багаторядковому рядку TextView, або ви не можете використовувати TextViewдля початку (наприклад, у користувацькій Viewреалізації).

Цей спосіб подібний textPaint.measureText(text), однак він здається більш точним у рідкісних випадках.

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