Любой простой способ измерить высоту текста? Я делаю это сейчас, используя Paint measureText()
для получения ширины, а затем методом проб и ошибок нахожу значение для получения приблизительной высоты. Я тоже возился FontMetrics
, но все это похоже на приблизительные методы, которые отстой.
Я пытаюсь масштабировать вещи для разных разрешений. Я могу это сделать, но в итоге получаю невероятно подробный код с большим количеством вычислений для определения относительных размеров. Я ненавижу это! Там должен быть лучший способ.
android
graphics
view
android-canvas
Danedo
источник
источник
Есть разные способы измерить рост в зависимости от того, что вам нужно.
getTextBounds
Если вы делаете что-то вроде точного центрирования небольшого количества фиксированного текста, вы, вероятно, захотите
getTextBounds
. Вы можете получить ограничивающий прямоугольник следующим образомКак вы можете видеть на следующих изображениях, разные строки будут иметь разную высоту (показаны красным).
Такая разная высота может быть недостатком в некоторых ситуациях, когда вам просто нужна постоянная высота независимо от текста. Смотрите следующий раздел.
Paint.FontMetrics
Вы можете рассчитать высоту шрифта из метрики шрифта. Высота всегда одинакова, потому что она получается из шрифта, а не из какой-либо конкретной текстовой строки.
Базовая линия - это строка, на которой расположен текст. Как правило, спуск - это самый дальний путь, на который персонаж пойдет ниже линии, а подъем, как правило, самый дальний, на который персонаж пойдет выше линии. Чтобы получить высоту, вы должны вычесть подъем, потому что это отрицательное значение. (Базовая линия уменьшает
y=0
иy
уменьшает экран.)Посмотрите на следующее изображение. Высоты для обеих струн
234.375
.Если вы хотите высоту строки, а не просто высоту текста, вы можете сделать следующее:
Это
bottom
иtop
из линии. Ведущий (межстрочный интервал) обычно равен нулю, но вы все равно должны его добавить.Изображения выше взяты из этого проекта . Вы можете поиграть с ним, чтобы увидеть, как работает метрика шрифта.
StaticLayout
Для измерения высоты многострочного текста вы должны использовать
StaticLayout
. Я говорил об этом более подробно в этом ответе , но основной способ получить эту высоту такой:источник
getTextSize()
дает вам размер шрифта в пиксельных единицах (в отличие отsp
единиц). @androiddeveloperОтвет @ bramp правильный - частично, в нем не упоминается, что вычисленные границы будут минимальным прямоугольником, который содержит текст полностью с неявными начальными координатами 0, 0.
Это означает, что высота, например, «Py» будет отличаться от высоты «py», «hi», «oi» или «aw», поскольку для каждого пикселя требуется разная высота.
Это ни в коем случае не эквивалентно FontMetrics в классической Java.
В то время как ширина текста не очень большая боль, высота -.
В частности, если вам нужно выровнять по центру нарисованный текст по вертикали, попробуйте получить границы текста «а» (без кавычек) вместо использования текста, который вы собираетесь рисовать. Работает для меня...
Вот что я имею в виду:
Выравнивание текста по центру по вертикали означает выравнивание по вертикали ограничивающего прямоугольника по центру, что отличается для разных текстов (заглавные буквы, длинные буквы и т. Д.). Но то, что мы действительно хотим сделать, это также выровнять базовые линии визуализированных текстов, чтобы они не выглядели приподнятыми или рифлеными. Таким образом, пока мы знаем центр самой маленькой буквы (например, «а»), мы можем повторно использовать ее выравнивание для остальных текстов. Это будет выравнивать по центру все тексты, а также выравнивать их по базовой линии.
источник
x >> 1
. Голосование только за это :)x / 2
и оптимизирует егоx >> 1
x / 2
гораздо более дружелюбен при чтении кода, учитывая комментарии Криса.buffer
в этом примере? Этоcanvas
передано вdraw(Canvas)
метод?Высота - это размер текста, который вы установили в переменной Paint.
Еще один способ узнать высоту
источник
Вы можете использовать
android.text.StaticLayout
класс, чтобы указать необходимые границы, а затем вызватьgetHeight()
. Вы можете нарисовать текст (содержащийся в макете), вызвав егоdraw(Canvas)
метод.источник
Вы можете просто получить размер текста для объекта Paint, используя метод getTextSize (). Например:
источник
24.0f
взялся?Вы должны использовать
Rect.width()
иRect.Height()
который вернулсяgetTextBounds()
вместо. Это подходит для меня.источник
Если у кого-то все еще есть проблемы, это мой код.
У меня есть пользовательский вид, который является квадратным (ширина = высота), и я хочу назначить ему символ.
onDraw()
показывает, как получить рост персонажа, хотя я не использую его. Символ будет отображаться в середине зрения.источник