这似乎是一个基本问题,但我无法在SO上找到类似的问题。在阅读documentation时,我无法理解这些概念。我想了解top
和ascent
以及bottom
和descent
之间的区别。基准到底在哪里?你有图表来帮我形象化吗?
答案 0 :(得分:231)
让我们先来看看documentation says:
的内容请注意,基线是前四个测量值。 行形成文本所在的 base ,即使某些字符(如g,y,j等)可能包含在行下方的部分。它与您在笔记本电脑上书写的线条相当。
这是一张帮助可视化这些内容的图片:
请记住,在Java和Android中使用画布进行绘制时,y中的增量下降是y中的减少。这意味着FontMetrics'top
和ascent
是负数,因为它们是从基线开始测量的(而下降和底部是正数)。因此,要获得top
到bottom
之间的距离,您需要执行此操作(bottom
- top
)。
前导是一行底部与下一行顶部之间的距离。在上面的图片中,它是第1行的橙色和第2行的紫色之间的空间。作为@MajorTom noted below,在排版中,该术语更恰当地定义为“连续行的基线之间的距离”类型。“*然而,Android似乎在更具历史意义上使用该术语。这个词(发音为“ledding”)来自旧排字机用于放置在类型线之间的铅条。它基本上只是一种调整行间距的方法。在Android中我从来没有真正看到领先的是0
以外的任何东西,我还没有看到它用于源代码中的任何东西。 (如果您知道它用于计算任何内容的位置,请更正我。)您可以使用代码中的setLineSpacing
或{x 3}中的android:lineSpacingExtra
和android:lineSpacingMultiplier
更改TextView
中的行距。 。但是,These methods不会使用或修改前导。
查看这些链接以获取更多信息:
top
和bottom
)为了更多地探索Font Metrics,我做了一个简单的项目。
而不是在这里列出所有代码。我added the project to GitHub。您可以克隆项目,也可以将以下文件复制到新项目中。
top
或低于bottom
?通常不会,但他们可以。正如我所理解的那样,顶部和底部是由字体设置的(因此是“FontMetrics”),因此字体制作者可以使字形高于他们所说的顶部(或低于底部)。此外,使用Unicode中的combining diacritical marks,很容易发生。这是一个比较极端的例子(从here拍摄):M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̡̪̬͎͍̥̬̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝帽子̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑!
将该字符串插入Android我们得到了这个:
变音符号高于top
且低于bottom
。有趣的是,总宽度和高度可以通过文本边界正确测量。
无论如何,出于编程中的所有实际目的,您可以假设字形字母的最大值和最小值为top
和bottom
。通常它们会保持在ascent
和decent
之内。如果出于某种原因,您需要确定字母是否超出top
或bottom
,您可以使用TextPaint.getTextBounds
。
答案 1 :(得分:4)
排行不是排版中的行之间的空格。显然这是Android代码没有考虑到的。我们一直在努力解决这个问题。前导(from Wikipedia)的正确定义:
在排版中,领先/lɛdɪŋ/指的是距离 连续线型的基线。该术语起源于日子 手工排版时,将细条状铅条插入 形式增加类型线之间的垂直距离。
据我所知,Android无法指定这一点。