Я хотів би отримати висоту, якщо це можливо.
Я хотів би отримати висоту, якщо це можливо.
Відповіді:
Можна використовувати 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();
textView.setTextSize()
.
Якщо вам просто потрібна ширина, ви можете використовувати:
float width = paint.measureText(string);
http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)
TextPaint paint = new TextPaint(); paint.setTextSize(textSize);
. textSize
знаходиться в пікселях.
Існує дві різні міри ширини для тексту. Одне - кількість пікселів, намальованих по ширині, а інше - кількість пікселів, якими курсор повинен бути розширений після нанесення тексту.
paint.measureText і paint.getTextWidths повертає кількість пікселів (у поплавці), які курсор повинен бути розширений після малювання заданого рядка. Для кількості намальованих пікселів використовуйте paint.getTextBounds, як зазначено в іншій відповіді. Я вважаю, що це називається "заздалегідь" шрифту.
У деяких шрифтах ці два вимірювання відрізняються (багато), наприклад, шрифт Black Chancery має літери, які проходять повз інші літери (перекриваються) - див. Велику літеру "L". Використовуйте paint.getTextBounds, як зазначено в іншій відповіді, щоб отримати пікселі фарбованими.
Я вимірював ширину таким чином:
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());
Це допомогло б вам.
Швидше за все, ви хочете дізнатись пофарбовані розміри для заданого рядка тексту із заданим шрифтом (наприклад, 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 нижче про пікселі, пофарбовані проти попередньої ширини ("кількість пікселів (у плавці), яку слід ввести курсором після нанесення даного рядка"), у разі якщо вам потрібно буде з цим впоратися.
Я хотів би поділитися кращим способом (більш універсальним, ніж поточна прийнята відповідь) отримання точної ширини намальованого тексту ( String
) з використанням статичного класу StaticLayout
:
StaticLayout.getDesiredWidth(text, textPaint))
цей метод є більш точним textView.getTextBounds()
, оскільки ви можете обчислити ширину одного рядка в багаторядковому рядку TextView
, або ви не можете використовувати TextView
для початку (наприклад, у користувацькій View
реалізації).
Цей спосіб подібний textPaint.measureText(text)
, однак він здається більш точним у рідкісних випадках.