首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在安卓的FontMetrics中,顶部、上升、基线、下降、底部和领先的含义

在安卓的FontMetrics中,顶部、上升、基线、下降、底部和领先的含义
EN

Stack Overflow用户
提问于 2014-12-24 13:01:02
回答 2查看 47.9K关注 0票数 98

这似乎是一个基本的问题,但我在上面找不到类似的问题。在阅读documentation时,我在理解概念时遇到了困难。我想了解topascent以及bottomdescent之间的区别。那么基线到底在哪里呢?你有没有图表可以帮我把它形象化?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-24 13:01:02

让我们首先回顾一下documentation says是什么

  • Top -给定文本字体中最高字形距基线的最大距离size.
  • Ascent -单间距text.
  • Descent字体基线上方的推荐距离-单间距text.
  • Bottom字体基线下方的推荐距离-给定文本字体中最低字形基线以下的最大距离size.
  • Leading -建议在文本行之间添加的额外间距。

请注意,前四个参数是从Baseline开始测量的。这是,它构成了文本所在的基础,即使有些字符(如g、y、j等)可能有低于这条线的部件。它可以与你在线条记事本上书写的线条相媲美。

下面是一张帮助可视化这些东西的图片:

请记住,在Java和Android的画布上绘图时,向下是y的增加,向上是y的减少。这意味着FontMetrics的topascent是负数,因为它们是从基线开始测量的(而下降和底部是正数)。因此,要获得从topbottom的距离,您需要这样做(bottom - top)。

行距是指一行的底部与下一行的顶部之间的距离。在上图中,它是第一行的橙色和第二行的紫色之间的空格。在排版中,这个词被更恰当地定义为“连续字体行的基线之间的距离”。然而,*似乎在更具历史意义的意义上使用了这个词。这个词(发音为"ledding")来自于旧排字员用来放在字行之间的前导带。这基本上只是一种调整行距的方法。在安卓系统中,我从来没有见过除了0之外的任何东西,我也没有在源代码中看到过它的用途。(如果您知道它用于计算任何东西的位置,请纠正我。)您可以使用代码中的setLineSpacing或xml中的android:lineSpacingExtraandroid:lineSpacingMultiplier来更改TextView中的行距。但是,These methods不使用或修改前导。

有关更多信息,请查看以下链接:

top

探索更多

为了更多地探索字体度量,我做了一个简单的项目。

而不是在这里列出所有代码。I added the project to GitHub。您可以克隆项目,也可以将以下文件复制到新项目中。

  • (自定义view)

字母会在top之上或bottom之下吗

通常不会,但他们可以。根据我的理解,顶部和底部是由字体设置的(因此是"FontMetrics"),所以字体制造者可以使字形高于他们所说的顶部(或低于底部)。而且,使用Unicode中的combining diacritical marks很容易发生这种情况。下面是一个相当极端的例子(取自here):M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬?̡̧̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲̐ͤ̐͛́͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ!̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

将该字符串插入到Android中,我们会得到如下结果:

变音符号位于top上方和bottom下方。但有趣的是,总宽度和总高度是由文本边界正确测量的。

无论如何,对于编程中的所有实际目的,您可以假设字形字母的最大值和最小值分别为topbottom。通常,它们会留在ascentdescent中。如果出于任何原因,您需要确定字母是否超出了topbottom,您可以使用TextPaint.getTextBounds

票数 317
EN

Stack Overflow用户

发布于 2016-06-11 02:13:14

行距不是排版中的行间空格。显然,Android代码没有考虑到这一点。我们自己也一直在努力解决这个问题。前导(from Wikipedia)的正确定义:

在排版中,leading /ˈlɛdɪŋ/指的是文字连续行的基线之间的距离。这一术语起源于手工排版时代,当时在表格中插入细长的铅条以增加排字行之间的垂直距离。

据我所知,Android没有办法指定这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27631736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档