100

这似乎是一个基本问题,但我在 SO 上找不到类似的问题。在阅读文档时,我无法掌握这些概念。我想了解topandascent和 alsobottom和之间的区别descent。基线到底在哪里?你有图表可以帮助我形象化吗?

4

2 回答 2

324

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

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

请注意,基线是测量前四个的依据。它是构成文本基础的,即使某些字符(如 g、y、j 等)可能有部分位于行下方。它与您在带衬里的笔记本上书写的线条相媲美。

这是一张有助于可视化这些事情的图片:

FontMetrics 显示顶部、上升、基线、体面、底部和领先

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

前导是一行底部和下一行顶部之间的距离。在上图中,它是第 1 行的橙色和第 2 行的紫色之间的空间。正如@MajorTom在下面指出的那样,在排版中,该术语更恰当地定义为“连续文字行的基线之间的距离”。*但是,Android 似乎在更具历史意义的情况下使用了该术语。这个词(发音为“ledding”)来自旧排字机用来放置在字体行之间的铅条。这基本上只是一种调整行距的方法。在 Android 中,我从来没有真正看到过领先于其他任何东西0而且我还没有看到它用于源代码中的任何内容。(如果您知道它用于计算任何内容,请纠正我。)您可以在代码或xml中TextView更改行距。但是,这些方法不使用或修改前导。setLineSpacingandroid:lineSpacingExtraandroid:lineSpacingMultiplier

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

探索更多

为了更多地探索 Font Metrics,我做了一个简单的项目。

在此处输入图像描述

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

字母会高于top还是低于bottom

通常不会,但他们可以。据我了解,顶部和底部是由字体设置的(因此是“FontMetrics”),因此字体制造商可以使字形高于他们所说的顶部(或低于底部)。此外,在 Unicode 中组合变音符号很容易发生。这是一个相当极端的例子(取自这里):m̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ͆̊̒ͦͦ͘͢͜b̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾e̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬?

将该字符串插入 Android 中,我们得到:

在此处输入图像描述

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

无论如何,出于编程中的所有实际目的,您可以假设字形字母的最大值和最小值是topand bottom。通常他们会留在ascent和内descent。如果出于某种原因您需要确定字母是否超出top或者bottom您可以使用TextPaint.getTextBounds.

于 2014-12-24T05:01:01.777 回答
5

前导不是排版中行之间的空格。显然,这是 Android 代码没有考虑到的。我们自己一直在为此苦苦挣扎。领先的正确定义(来自维基百科):

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

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

于 2016-06-10T18:13:13.793 回答