Android FontMetrics中最高,上升,基线,下降,最低和领先的含义


90

这似乎是一个基本问题,但是我在SO上找不到类似的问题。在阅读文档时,我很难理解这些概念。我想了解有什么区别之间topascent,也bottomdescent。基线到底在哪里?您有图表来帮助我对其进行可视化吗?

Answers:


286

首先让我们回顾一下文档中所说的内容

  • 顶部-在给定的文本大小下,字体中最高字形的基线上方最大距离。
  • 上升-单行间距文本在基线上方的建议距离。
  • 下降-单行间距文本在基线以下的推荐距离。
  • 底部-在给定的文本大小下,字体下最低字形的基线以下最大距离。
  • 前导-建议在文本行之间添加额外的空格。

注意,基线是前四个度量的基准。它是线构成基础的文本坐,即使有些字符(比如,收率,J等)可能有走线以下的部分。它可与您在带衬线笔记本中书写的行相媲美。

这是一张有助于可视化这些东西的图片:

FontMetrics显示顶部,上升,基线,体面,底部和前导

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

领先是一条线的底部和下一行的顶部之间的距离。在上图中,它是第1行的橙色和第2行的紫色之间的空间。如下面的@MajorTom所述,在印刷术中,该术语更恰当地定义为“连续的类型的基线之间的距离”。*但是,Android似乎更具有历史意义。这个单词(发音为“ ledding”)来自铅字带,旧的排字员习惯将铅字带放在字体之间。基本上,这只是一种调整行距的方法。在Android中,我从来没有真正看到领先者是0而且我还没有在源代码中看到它用于任何用途。(纠正我,如果你知道它是用来计算任何东西。)你可以改变的行距TextViewsetLineSpacing代码或android:lineSpacingExtraandroid:lineSpacingMultiplierXML格式。但是,这些方法不使用或修改引导。

查看这些链接以获取更多信息:

探索更多

为了进一步探索Font Metrics,我做了一个简单的项目。

在此处输入图片说明

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

字母是在上方top还是下方bottom

通常不,但是他们可以。据我所知,顶部和底部是由字体设置的(因此称为“ FontMetrics”),因此字体制造商可以使字形高于其所说的顶部(或低于底部)。同样,通过在Unicode中组合变音标记,它可以很容易地发生。这是一个极端的例子(取自此处):M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆¿̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒ سͧͤ͐̓͋̌̾̇̔̈̀̀

将字符串插入Android,我们得到以下信息:

在此处输入图片说明

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

无论如何,出于编程中的所有实际目的,您可以仅假定字形字母的max和min为topbottom。通常,它们会留在ascent和内decent。如果由于任何原因您需要确定字母是否超出范围topbottom可以使用TextPaint.getTextBounds


真好!您知道上升,下降等以什么单位计量吗?它们以像素为单位吗?它们是浮点值,但不确定它们与屏幕的对应关系。让他们在photoshop中检查一下是否为像素,并且有几个单位的细微差别。像素较小。
Vikram Gupta

@VikramGupta。单位是像素。我不确定是什么原因导致您的Photoshop图像检查有所不同。
Suragch

感谢您的有用解释和该应用程序。但是,您能进一步解释一下,这到底是什么Top?有没有足够高的字母可以碰Top线?例如,“ M”,“ l”似乎是最高的字母。他们都没有感动Top
Cheok Yan Cheng

@CheokYanCheng,请参阅答案末尾的更新。
Suragch

@Suragch感谢您提供信息。我使用您的应用了解更多信息。我希望“上升”行将恰好触及屏幕截图中字体的顶部。但是,从最新的i.imgur.com/aRxgjvu.png来看,它没有碰到最高的字符“ M”。你知道为什么吗?
Cheok Yan Cheng

5

排版中的行之间不能有空格。显然这是Android代码未考虑的问题。我们自己一直在为此奋斗。领导的正确定义(来自维基百科):

在排版中,前导/ ˈlɛdɪŋ /指的是连续类型的基线之间的距离。该术语起源于手工排版的日子,当时将细铅条插入表格中以增加字体之间的垂直距离。

据我所知,Android无法指定此方法。


+1可以帮助我更好地理解领导。至于改变领导的话,你可以使用TextView中的setLineSpacing代码或android:lineSpacingExtraandroid:lineSpacingMultiplierXML格式。
Suragch

谢谢-是的,我们被告知要使用android:lineSpacingExtra它将在线之间的实际空间之间进行测量。它不是领先的,但似乎是管理间距的唯一方法。这是一个问题,因为排版中没有这种度量,也没有这样的方法可以在Sketch或Zepelin(我们使用的工具)中指定该度量。另外,它与领先者不符。
MajorTom

1
如果印刷前导是基线之间的距离,则看起来应该很容易计算。
Suragch

那正是我所想。有没有办法以编程方式进行?我希望Android提供的方法可以做到这一点。我们合作的开发人员似乎并不了解。
MajorTom

它已经有一段时间,因为我有这个工作,但如果我打算把它再次,我将开始在这里这里和尝试不同的文本和字体。即使不是直截了当,我也无法相信没有一种方法可以计算出您的需求。
Suragch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.