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

Sur*_*gch 81 android fontmetrics

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

Sur*_*gch 248

我们先来看看文档说的内容:

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

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

这是一张图片,以帮助可视化这些事情:

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

请记住,在Java和Android的画布上绘图时,下降是y 的增加,而上升是y 的减少.这意味着,FontMetrics对象topascent因为它们是从基线测量的是负数(而下降和底部为正数).因此,为了从远处topbottom你需要做的(bottom- top).

领先是一条线的底部和下一行的顶部之间的距离.在上面的图片中,它是第1行的橙色和第2行的紫色之间的空间.正如@MajorTom 所述,在排版中,该术语被更恰当地定义为"连续行的基线之间的距离".*但是,Android似乎使用更具历史意义的术语.这个词(发音为"ledding")来自旧排字机用于放置在类型线之间的铅条.它基本上只是一种调整行间距的方法.在Android中我从来没有真正看到领先的东西,除了0我没有看到它用于源代码中的任何东西.(如果你知道它是用来计算任何指正.)你可以改变的行距TextViewsetLineSpacing代码或android:lineSpacingExtraandroid:lineSpacingMultiplierXML格式.但是,这些方法不使用或修改前导.

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

探索更多

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

在此输入图像描述

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

信件是高于top还是低于bottom

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

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

在此输入图像描述

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

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


Maj*_*Tom 5

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

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

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


归档时间:

查看次数:

35897 次

最近记录:

8 年 前