这似乎是一个基本问题,但我在 SO 上找不到类似的问题。在阅读文档时,我无法掌握这些概念。我想了解top
andascent
和 alsobottom
和之间的区别descent
。基线到底在哪里?你有图表可以帮助我形象化吗?
2 回答
让我们首先回顾一下文档所说的内容:
- 顶部- 在给定文本大小下,字体中最高字形的基线上方的最大距离。
- Ascent - 对于单行间距文本,推荐的高于基线的距离。
- Descent - 对于单行间距文本,推荐的低于基线的距离。
- 底部- 在给定文本大小下,字体中最低字形的基线下方的最大距离。
- 前导- 建议在文本行之间添加的额外空间。
请注意,基线是测量前四个的依据。它是构成文本基础的行,即使某些字符(如 g、y、j 等)可能有部分位于行下方。它与您在带衬里的笔记本上书写的线条相媲美。
这是一张有助于可视化这些事情的图片:
请记住,当在 Java 和 Android 中的画布上绘图时,向下是 y 的增加,向上是 y 的减少。这意味着 FontMetricstop
和ascent
是负数,因为它们是从基线测量的(而下降和底部是正数)。因此,要获得与您的距离top
,bottom
您需要执行 ( bottom
- top
)。
前导是一行底部和下一行顶部之间的距离。在上图中,它是第 1 行的橙色和第 2 行的紫色之间的空间。正如@MajorTom在下面指出的那样,在排版中,该术语更恰当地定义为“连续文字行的基线之间的距离”。*但是,Android 似乎在更具历史意义的情况下使用了该术语。这个词(发音为“ledding”)来自旧排字机用来放置在字体行之间的铅条。这基本上只是一种调整行距的方法。在 Android 中,我从来没有真正看到过领先于其他任何东西0
而且我还没有看到它用于源代码中的任何内容。(如果您知道它用于计算任何内容,请纠正我。)您可以在代码或xml中TextView
更改行距。但是,这些方法不使用或修改前导。setLineSpacing
android:lineSpacingExtra
android:lineSpacingMultiplier
查看这些链接以获取更多信息:
- 精确的Android文本绘制
- Java(和 Android)中的字体度量
- 布局文件
- Java:FontMetrics 上升不正确?
- 在 Android 设备上运行时,FontMetrics 不正确。模拟器不错
- Java Font Metrics(Java 似乎不使用
top
andbottom
)
探索更多
为了更多地探索 Font Metrics,我做了一个简单的项目。
而不是在这里列出所有代码。我将项目添加到 GitHub。您可以克隆项目,也可以将以下文件复制到新项目中。
字母会高于top
还是低于bottom
?
通常不会,但他们可以。据我了解,顶部和底部是由字体设置的(因此是“FontMetrics”),因此字体制造商可以使字形高于他们所说的顶部(或低于底部)。此外,在 Unicode 中组合变音符号很容易发生。这是一个相当极端的例子(取自这里):m̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ͆̊̒ͦͦ͘͢͜b̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾e̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬?
将该字符串插入 Android 中,我们得到:
变音符号位于 的上方top
和下方bottom
。有趣的是,总宽度和高度是由文本边界正确测量的。
无论如何,出于编程中的所有实际目的,您可以假设字形字母的最大值和最小值是top
and bottom
。通常他们会留在ascent
和内descent
。如果出于某种原因您需要确定字母是否超出top
或者bottom
您可以使用TextPaint.getTextBounds
.
前导不是排版中行之间的空格。显然,这是 Android 代码没有考虑到的。我们自己一直在为此苦苦挣扎。领先的正确定义(来自维基百科):
在排版中,前导 /ˈlɛdɪŋ/ 是指连续文字行的基线之间的距离。该术语起源于手工排版时代,当时将薄铅条插入表格中以增加字体行之间的垂直距离。
据我所知,Android 没有办法指定这一点。