Android的FontMetrics中顶部,上升,底线,下降,底部和领先的含义

这似乎是一个基本的问题,但我找不到类似的问题。 在阅读文档时 ,我很难理解这些概念。 我想了解toptop以及bottombottom之间的区别。 基准线究竟在哪里? 你有图表来帮助我想象它吗?

我们先来回顾一下这个文档所说的内容 :

  • 顶部 – 给定文字大小的字体中最高字形的基线上方的最大距离。
  • 上升(Ascent) – 推荐的单行间距文本基线以上的距离。
  • 下降 – 推荐距离低于基线的单独间隔文本。
  • 底部 – 指定文字大小下字体中最低字形的基线以下的最大距离。
  • 领导 – 推荐的额外空间添加在文本行之间。

请注意, 基准线是前四个测量的基准线 。 即使某些字符(如g,y,j等)可能有部分位于该行之下,也是构成文本所在的基础的行。 这与您在笔记本上书写的线条相媲美。

这里有一张图片来帮助把这些东西形象化:

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

请记住,在Java和Android上绘制canvas时,下降会增加 y,上升会减less y。 这意味着FontMetrics的toptop是负数,因为它们是从基线测量的(而下降和底部是正数)。 因此,为了获得bottom的距离,你需要做( bottomtop )。

领先的是一条线的底部和下一条线的顶部之间的距离。 在上面的图片中,第一行的橙色和第二行的紫色之间的空格。正如@MajorTom 在下面指出的那样 ,在印刷术中,这个术语更恰当地定义为“连续线型的基线之间的距离”。 但是,Android似乎更多地使用这个术语。 这个词(发音为“ledding”)来自旧排字机用于放置在线条之间的铅条。 这基本上只是一种调整行间距的方法。 在Android中,我从来没有看到过任何东西,除了0 ,我还没有看到它用于源代码中的任何东西。 (纠正我,如果你知道它在什么地方用来计算任何东西。)你可以更改TextView中的setLineSpacing在代码中使用setLineSpacing或者在xml中使用android:lineSpacingExtraandroid:lineSpacingMultiplier 。 但是, 这些方法不能利用或修改领导。

查看这些链接了解更多信息:

  • 精确的Android文字绘图
  • Java中的字体指标(和Android)
  • 布局文件
  • Java:FontMetrics ascent不正确?
  • 在Android设备上运行时FontMetrics不正确。 模拟器很好
  • Java字体指标 (Java似乎没有使用topbottom

探索更多

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

在这里输入图像描述

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

  • FontMetricsView.java (自定义视图)
  • MainActivity.java
  • activity_main.xml中

字母是否高于或低于bottom

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

把这个string插入到Android中,我们得到这个:

在这里输入图像描述

变音标记在topbottom top 。 有趣的是,总的宽度和高度可以通过文本边界正确测量。

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

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

在印刷术中,领先的/lɛdɪŋ/是指连续线型的基线之间的距离。 这个术语起源于手工排版的时代,当细条带被插入到forms中时,增加了线条之间的垂直距离。

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