Есть разные способы измерить рост в зависимости от того, что вам нужно.
Если вы делаете что-то вроде точного центрирования небольшого количества фиксированного текста, вы, вероятно, захотите 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
уменьшает экран.)
Посмотрите на следующее изображение. Высоты для обеих струн 234.375
.
Если вы хотите высоту строки, а не просто высоту текста, вы можете сделать следующее:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Это bottom
и top
из линии. Ведущий (межстрочный интервал) обычно равен нулю, но вы все равно должны его добавить.
Изображения выше взяты из этого проекта . Вы можете поиграть с ним, чтобы увидеть, как работает метрика шрифта.
Для измерения высоты многострочного текста вы должны использовать 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();