Android的FontMetrics中顶部,上升,底线,下降,底部和领先的含义
这似乎是一个基本的问题,但我找不到类似的问题。 在阅读文档时 ,我很难理解这些概念。 我想了解top
和top
以及bottom
和bottom
之间的区别。 基准线究竟在哪里? 你有图表来帮助我想象它吗?
我们先来回顾一下这个文档所说的内容 :
- 顶部 – 给定文字大小的字体中最高字形的基线上方的最大距离。
- 上升(Ascent) – 推荐的单行间距文本基线以上的距离。
- 下降 – 推荐距离低于基线的单独间隔文本。
- 底部 – 指定文字大小下字体中最低字形的基线以下的最大距离。
- 领导 – 推荐的额外空间添加在文本行之间。
请注意, 基准线是前四个测量的基准线 。 即使某些字符(如g,y,j等)可能有部分位于该行之下,也是构成文本所在的基础的行。 这与您在笔记本上书写的线条相媲美。
这里有一张图片来帮助把这些东西形象化:
请记住,在Java和Android上绘制canvas时,下降会增加 y,上升会减less y。 这意味着FontMetrics的top
和top
是负数,因为它们是从基线测量的(而下降和底部是正数)。 因此,为了获得bottom
的距离,你需要做( bottom
– top
)。
领先的是一条线的底部和下一条线的顶部之间的距离。 在上面的图片中,第一行的橙色和第二行的紫色之间的空格。正如@MajorTom 在下面指出的那样 ,在印刷术中,这个术语更恰当地定义为“连续线型的基线之间的距离”。 但是,Android似乎更多地使用这个术语。 这个词(发音为“ledding”)来自旧排字机用于放置在线条之间的铅条。 这基本上只是一种调整行间距的方法。 在Android中,我从来没有看到过任何东西,除了0
,我还没有看到它用于源代码中的任何东西。 (纠正我,如果你知道它在什么地方用来计算任何东西。)你可以更改TextView
中的setLineSpacing
在代码中使用setLineSpacing
或者在xml中使用android:lineSpacingExtra
和android:lineSpacingMultiplier
。 但是, 这些方法不能利用或修改领导。
查看这些链接了解更多信息:
- 精确的Android文字绘图
- Java中的字体指标(和Android)
- 布局文件
- Java:FontMetrics ascent不正确?
- 在Android设备上运行时FontMetrics不正确。 模拟器很好
- Java字体指标 (Java似乎没有使用
top
和bottom
)
探索更多
为了更多地探索Font Metrics,我做了一个简单的项目。
而不是在这里列出所有的代码。 我把项目添加到GitHub 。 您可以克隆该项目,或将以下文件复制到一个新项目。
- FontMetricsView.java (自定义视图)
- MainActivity.java
- activity_main.xml中
字母是否高于或低于bottom
?
通常不,但他们可以。 据我所知,顶部和底部是由字体(因此是“FontMetrics”)设置的,所以字体制作者可以使字形高于他们所说的顶部(或低于底部)。 另外,在Unicode中使用变音符号可以很容易地发生。 这是一个比较极端的例子(摘自这里 ):?!M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̡̪̬͎͍̥̬̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝帽子̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑
把这个string插入到Android中,我们得到这个:
变音标记在top
和bottom
top
。 有趣的是,总的宽度和高度可以通过文本边界正确测量。
无论如何,对于编程中的所有实际目的,您可以假定字形字母的最大值和最小值是top
和bottom
。 通常他们会保持ascent
和decent
。 如果出于任何原因,您需要确定字母是否超出top
或bottom
,则可以使用TextPaint.getTextBounds
。
领导不是排版中的行之间的空间。 显然这是Android代码没有考虑到的东西。 我们一直在自己挣扎。 领导的正确定义( 来自维基百科 ):
在印刷术中,领先的/lɛdɪŋ/是指连续线型的基线之间的距离。 这个术语起源于手工排版的时代,当细条带被插入到forms中时,增加了线条之间的垂直距离。
据我所知,Android没有办法指定这个。
- 如何从命令行添加外部jar库到一个android项目
- Android View.getDrawingCache返回null,仅为null
- 片段onCreateView和onActivityCreated调用两次
- 如何在改造中处理dynamicJSON?
- CardView layout_width =“match_parent”与父RecyclerView宽度不匹配
- Android / Maven项目中如何处理缺lesssrc / test / java源文件夹?
- findFragmentById总是返回null
- 同步ScrollView滚动位置 – android
- Android MediaPlayer问题:“Error(-38,0)”和“stop in state called 1”