Існують різні способи вимірювання висоти залежно від того, що вам потрібно.
Якщо ви робите щось на кшталт точно центрування невеликої кількості фіксованого тексту, ви, мабуть, хочете getTextBounds
. Ви можете отримати обмежуючий прямокутник таким
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Як видно з наступних зображень, різні рядки даватимуть різну висоту (показані червоним кольором).
Ці різні висоти можуть бути недоліком у деяких ситуаціях, коли вам просто потрібна постійна висота, незалежно від тексту. Дивіться наступний розділ.
Ви можете обчислити висоту шрифту з метрики шрифту. Висота завжди однакова, оскільки її отримують із шрифту, а не будь-якого конкретного текстового рядка.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
Основна лінія - це рядок, на якому сидить текст. Спуск, як правило, найдальший персонаж піде нижче лінії, а сходження, як правило, найдаліший персонаж піде вище лінії. Для отримання висоти вам потрібно відняти підйом, оскільки це від'ємне значення. (Базовий рівень є y=0
і y
descreases до екрану.)
Подивіться на наступне зображення. Висоти для обох струн є 234.375
.
Якщо вам потрібна висота рядка, а не лише висота тексту, ви можете зробити наступне:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Це bottom
та top
лінія. Провідний (міжрядковий інтервал) зазвичай дорівнює нулю, але все одно слід додати його.
Зображення, наведені вище, походять із цього проекту . Ви можете пограти з ним, щоб побачити, як працюють метрики шрифтів.
Для вимірювання висоти багаторядкового тексту слід використовувати a StaticLayout
. Я детально розповів про це у цій відповіді , але основний спосіб досягти такої висоти такий:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();