java - Java 中的字体指标不正确/缺失?

标签 java layout fonts font-size

使用某种字体,我使用Java的FontLayout来确定它的上升、下降和行距。 (参见 Java 的 FontLayout 教程 here)

在我的具体案例中,我使用的是 Arial Unicode MS,字体大小为 8。使用以下代码:

    Font font = new Font("Arial Unicode MS", 0, 8);
    TextLayout layout = new TextLayout("Pp", font,
                               new FontRenderContext(null, true, true));
    System.out.println( "Ascent: "+layout.getAscent());
    System.out.println( "Descent: "+layout.getDescent());
    System.out.println( "Leading: "+layout.getLeading());

Java 为我提供了以下值:

    Ascent: 8.550781
    Descent: 2.1679688
    Leading: 0.0

到目前为止一切顺利。但是,如果我使用这些值的总和作为各行文本的行间距,这与 OpenOffice、Microsoft Word 等中使用的行间距有很大不同:它更小。使用默认单行间距时,Word 和 OO 的行间距似乎约为 13.7pt(而不是像我使用上述 Java 字体指标计算的那样10.7pt)。

任何想法

  1. 这是为什么?
  2. 我是否可以通过某种方式访问​​ Word 和 OpenOffice 似乎正在访问的字体信息,从而导致这种不同的行间距?

到目前为止我尝试过的事情:

  • 使用 font.getNumGlyphs() 等将所有字形添加到字形 vector - 仍然获得相同的字体规范值
  • 按照描述使用多行 here - 我得到的每一行都具有与上述相同的字体指标。
  • 使用 FontMetrics 的方法,例如 getLeading()

最佳答案

Zarkonnen 不应该投反对票,因为他的路线是正确的。许多 Java 字体似乎返回零作为它们的前导,而它们也许不应该返回。也许是下降到this bug : 我不知道。把这个空格放回去似乎取决于你。

排版行高通常定义为上升+下降+行距。 ascent 和 descent 是从角色所在的基线向上和向下测量的,leading 是一条线的下降线和下面的线的上升线之间的空间。

alt text

但是领先不是固定的。您可以在大多数文字处理和排版软件中设置行距。 Word 将此称为行间距。最初的问题可能是询问 Microsoft Word 如何计算其单行间距。微软的recommendations for OpenType fonts似乎表明不同平台上的软件计算方式不同。 (也许这就是 Java 现在返回零的原因?)

快速谷歌搜索似乎表明领导的经验法则是 120% of ascent+descent for single-line spacing , 或固定点间距;说所有行之间领先 2pts。在我找不到任何硬性或快速规则的情况下,我会说这归结为您所呈现的文本的易读性,您应该只使用您认为最好的内容。

关于java - Java 中的字体指标不正确/缺失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/925147/

相关文章:

java - 单选按钮和字体更改

java - java中静态变量的类级锁

java - 通过字段 'employeeDao' 表示不满足的依赖关系;

Java 8 java.util.stream.流

algorithm - Flipboard的布局算法

java - 在 Java 中将字体类型设置为 Futura

java - UTF-8 字符显示不正确

java - 让父线程等待直到子线程完成或超时

android - 如何更改 Android 中按下事件的文本颜色?

java - Android GridLayout 中将图像拉伸(stretch)至屏幕大小