Существуют различные способы измерения высоты в зависимости от того, что вам нужно.
Если вы делаете что-то вроде точного центрирования небольшого количества фиксированного текстаВы, вероятно, хотите 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();