Значение верха, подъема, базовой линии, спуска, дна и ведущих в Android FontMetrics
это похоже на основной вопрос, но я не мог найти похожий на SO. Во время чтения документация, у меня были проблемы с пониманием концепций. Я хочу понять, в чем разница между top
и ascent
и bottom
и descent
. И где именно находится исходная линия? У вас есть схема, которая поможет мне ее визуализировать?
2 ответа:
давайте сначала рассмотрим, что такое информация:
- Top - максимальное расстояние над базовой линией для самого высокого глифа в шрифте при заданном размере текста.
- подъем - рекомендуемое расстояние над базовой линией для особо размеченный текст.
- спуск - рекомендуемое расстояние ниже базовой линии для выбранного размеченный текст.
- дно - максимальное расстояние ниже базовой линии для самого низкого глифа в шрифте при заданном размере текста.
- ведущий - рекомендуемое дополнительное пространство для добавления между строками текста.
отметим, что базовый то, что первые четыре измеряются. Это строка которая составляет базовый что текст сидит, хотя некоторые символы (например, g, y, j, так далее.) может иметь части, которые идут ниже линии. Это сравнимо с линиями, которые вы пишете в выровненной тетради.
вот изображение, чтобы помочь визуализировать эти вещи:
помните, что при рисовании на холсте в Java и Android, идем вниз увеличить в y и вверх это уменьшить в y. это означает, что FontMetrics'
top
иascent
являются отрицательными числами, так как они измеряются от базовая линия (в то время как спуск и дно являются положительными числами). Таким образом, чтобы получить расстояние отtop
доbottom
вам нужно будет сделать (bottom
-top
).The ведущий - это расстояние между нижней и верхней части следующей строки. На картинке выше, это пространство между оранжевой линии 1 и Линии 2. Как @MajorTom указано ниже, в типографии термин более правильно определяется как "расстояние между базовые линии последовательных строк типа."* однако Android, похоже, использует этот термин в более историческом смысле. Слово (произносится "ledding") происходит от свинцовой полосы, которую старые наборщики использовали для размещения между строками типа. Это был в основном просто способ настроить межстрочный интервал. В Android я никогда не видел, чтобы ведущий был чем-то другим, кроме
0
и я не видела ничего в исходном коде. (Поправьте меня, если вы знаете, где он используется для расчета что угодно.) Вы можете изменить межстрочный интервал вTextView
СsetLineSpacing
в коде илиandroid:lineSpacingExtra
иandroid:lineSpacingMultiplier
в xml. эти методы, однако, не используйте и не изменяйте ведущие.проверьте эти ссылки для получения дополнительной информации:
- Точный Android Текстовый Рисунок
- метрики шрифтов в Java (и Android)
- макет документация
- Java: FontMetrics восхождение неверно?
- FontMetrics не правильно при запуске на android устройстве. Симулятор отлично
- Метрики Шрифтов Java (Java, похоже, не использует
top
иbottom
)узнать больше
чтобы изучить метрики шрифтов больше, я сделал простой проект.
вместо того, чтобы перечислять весь код здесь. Я добавлен проект в GitHub. Вы можете либо клонировать проект, либо скопировать следующие файлы в новый проект.
- FontMetricsView.java (пользовательский view)
- MainActivity.java
- activity_main.xml
письма когда-нибудь идут выше
top
или меньшеbottom
?обычно нет, но они могут. Верхняя и нижняя части, как я понимаю, задаются шрифтом (следовательно, "FontMetrics"), поэтому создатель шрифтов может сделать глиф выше, чем то, что они говорят сверху (или ниже, чем внизу). Кроме того, с диакритические знаки в Unicode это может очень легко произойти. Вот довольно экстремальный пример (взято из здесь): может быть,҉ H ?s҉? ААА!
подключив эту строку в Android, мы получим следующее:
диакритические знаки над
top
и нижеbottom
. Интересно отметить, что общая ширина и высота корректно измеряются по текстовым границам, хотя.в любом случае, для всех практических целей в вашем программировании вы можете просто предположить, что max и min для букв глифа являются
top
иbottom
. И обычно они будут оставаться в пределахascent
иdecent
. Если по какой-то причине вам нужно знать наверняка, если буквы выходят за рамкиtop
илиbottom
можно использоватьTextPaint.getTextBounds
.
Leading - это не пространство между строками в типографии. Видимо это что-то Android код не учитывает. Мы сами с этим боролись. Правильное определение ведущего (из Википедии):
в типографии, ведущий /llɛdɪŋ/ относится к расстоянию между базовые линии последовательных строк типа. Термин возник в те дни рук-набирать, когда тонкие прокладки руководства были введены в формы для увеличения вертикальное расстояние между строками.
из того, что я могу сказать, Android не имеет способа указать это.