Существуют различные способы измерения высоты в зависимости от того, что вам нужно.
Если вы делаете что-то вроде точно центрирования небольшого количества фиксированного текста, вы, вероятно, хотите getTextBounds
. Вы можете получить прямоугольник как этот
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Как вы можете видеть на следующих изображений, различные строки будут давать разную высоту (показаны красным цветом).
Эти различные высоты может быть недостаток в некоторых ситуациях, когда вы просто не нуждаются в постоянной высоте, независимо от того, каков текст. См. Следующий раздел.
Вы можете рассчитать Hight шрифта из метрик шрифта. Высота всегда одна и та же, потому что она получена из шрифта, а не какой-либо конкретной текстовой строки.
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
линии. Ведущий (интерлайн-интервал) обычно равен нулю, но вы должны добавить его в любом случае.
Образы вышеприведенные - this project. Вы можете поиграть с ним, чтобы увидеть, как работают функции Font Metrics.
Для измерения высоты многострочного текста следует использовать StaticLayout
. Я говорил об этом более подробно в this answer, но основной способ получить эту высоту, как это:
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();
Это дает очень странные результаты, когда я оценить высоту текста. Короткий текст приводит к высоте 12, тогда как ДЕЙСТВИТЕЛЬНО длинный текст приводит к высоте 16 (с учетом размера шрифта 16). Не имеет для меня никакого смысла (android 2.3.3) – AgentKnopf
Разница в высоте - это то, где у вас есть descenders в тексте, т. Е.«Высокий» выше «Низкий» из-за части g ниже строки – FrinkTheBrave