Android的FontMetrics中top,ascent,baseline,descent,bottom和leading的含义

时间:2014-12-24 05:01:02

标签: android fontmetrics

这似乎是一个基本问题,但我无法在SO上找到类似的问题。在阅读documentation时,我无法理解这些概念。我想了解topascent以及bottomdescent之间的区别。基准到底在哪里?你有图表来帮我形象化吗?

2 个答案:

答案 0 :(得分:231)

让我们先来看看documentation says

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

请注意,基线是前四个测量值。 形成文本所在的 base ,即使某些字符(如g,y,j等)可能包含在行下方的部分。它与您在笔记本电脑上书写的线条相当。

这是一张帮助可视化这些内容的图片:

FontMetrics showing top, ascent, baseline, decent, bottom, and leading

请记住,在Java和Android中使用画布进行绘制时,y中的增量下降是y中的减少。这意味着FontMetrics'topascent是负数,因为它们是从基线开始测量的(而下降和底部是正数)。因此,要获得topbottom之间的距离,您需要执行此操作(bottom - top)。

前导是一行底部与下一行顶部之间的距离。在上面的图片中,它是第1行的橙色和第2行的紫色之间的空间。作为@MajorTom noted below,在排版中,该术语更恰当地定义为“连续行的基线之间的距离”类型。“*然而,Android似乎在更具历史意义上使用该术语。这个词(发音为“ledding”)来自旧排字机用于放置在类型线之间的铅条。它基本上只是一种调整行间距的方法。在Android中我从来没有真正看到领先的是0以外的任何东西,我还没有看到它用于源代码中的任何东西。 (如果您知道它用于计算任何内容的位置,请更正我。)您可以使用代码中的setLineSpacing或{x 3}中的android:lineSpacingExtraandroid:lineSpacingMultiplier更改TextView中的行距。 。但是,These methods不会使用或修改前导。

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

探索更多

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

enter image description here

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

字母是否高于top或低于bottom

通常不会,但他们可以。正如我所理解的那样,顶部和底部是由字体设置的(因此是“FontMetrics”),因此字体制作者可以使字形高于他们所说的顶部(或低于底部)。此外,使用Unicode中的combining diacritical marks,很容易发生。这是一个比较极端的例子(从here拍摄):M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̡̪̬͎͍̥̬̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝帽子̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑!

将该字符串插入Android我们得到了这个:

enter image description here

变音符号高于top且低于bottom。有趣的是,总宽度和高度可以通过文本边界正确测量。

无论如何,出于编程中的所有实际目的,您可以假设字形字母的最大值和最小值为topbottom。通常它们会保持在ascentdecent之内。如果出于某种原因,您需要确定字母是否超出topbottom,您可以使用TextPaint.getTextBounds

答案 1 :(得分:4)

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

  

在排版中,领先/lɛdɪŋ/指的是距离   连续线型的基线。该术语起源于日子   手工排版时,将细条状铅条插入   形式增加类型线之间的垂直距离。

据我所知,Android无法指定这一点。