gpt4 book ai didi

android - Android FontMetrics 中 top、ascent、baseline、descent、bottom 和领先的含义

转载 作者:IT老高 更新时间:2023-10-28 13:10:11 25 4
gpt4 key购买 nike

这似乎是一个基本问题,但我在 SO 上找不到类似的问题。阅读时documentation ,我在理解概念时遇到了麻烦。我想了解 top 之间的区别是什么和 ascent还有 bottomdescent .基线到底在哪里?你有图表可以帮助我形象化吗?

最佳答案

让我们先回顾一下 documentation says 是什么:

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

  • 请注意, 基线 是前四个的测量值。 形成了文本所在的 基数 ,即使某些字符(如 g、y、j 等)可能具有该行下方的部分。它可以与您在横格笔记本上书写的线条相媲美。
    这是一张有助于形象化这些事情的图片:
    FontMetrics showing top, ascent, baseline, decent, bottom, and leading
    请记住,在 Java 和 Android 中在 Canvas 上绘图时,向下是 y 的增加,向上是 y 的减少。这意味着 FontMetrics 的 topascent 是负数,因为它们是从基线测量的(而下降和底部是正数)。因此,要获得从 topbottom 的距离,您需要执行 ( bottom - top )。
    前导 是一行底部与下一行顶部之间的距离。在上图中,它是第 1 行的橙色和第 2 行的紫色之间的空间。作为@MajorTom noted below,在排版中,该术语更恰本地定义为“类型连续行的基线之间的距离”。 * 但是,Android 似乎在更具历史意义的情况下使用该术语。这个词(发音为“ledding”)来自旧排字机用来放置在类型行之间的铅条。它基本上只是一种调整行距的方法。在 Android 中,我实际上从未见过除 0 以外的其他任何东西,而且我还没有看到它在源代码中用于任何东西。 (如果您知道它用于计算任何内容,请纠正我。)您可以更改 TextView 中的行间距,代码中为 setLineSpacing ,或者 xml 中的 android:lineSpacingExtra android:lineSpacingMultiplier 。但是, These methods 不使用或修改前导。
    查看这些链接以获取更多信息:
  • Precise Android Text Drawing
  • Font Metrics in Java (and Android)
  • Layout documentation
  • Java: FontMetrics ascent incorrect?
  • FontMetrics not correct when run on android device. Simulator fine
  • Java Font Metrics(Java 似乎不使用 topbottom )

  • 探索更多
    为了更多地探索Font Metrics,我做了一个简单的项目。
    enter image description here
    而不是在这里列出所有代码。我 added the project to GitHub 。您可以克隆项目,也可以将以下文件复制到新项目中。
  • FontMetricsView.java(自定义 View )
  • MainActivity.java
  • activity_main.xml

  • 字母是否曾经超过 top 或低于 bottom
    通常不会,但他们可以。据我了解,顶部和底部由字体设置(因此是“FontMetrics”),因此字体制造商可以使字形高于他们所说的顶部(或低于底部)。此外,对于 Unicode 中的 combining diacritical marks,它很容易发生。这是一个比较极端的例子(从 here取):?!M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̡̪̬͎͍̥̬̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝帽子̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑͡
    将该字符串插入Android,我们得到:
    enter image description here
    变音符号位于 top 上方和 bottom 下方。有趣的是,总的宽度和高度是由文本边界正确测量的。
    无论如何,出于编程中的所有实际目的,您可以假设字形字母的最大值和最小值是 topbottom 。通常它们会保持在 ascentdescent 内。如果出于某种原因您需要确定字母是否超出 topbottom ,则可以使用 TextPaint.getTextBounds

    关于android - Android FontMetrics 中 top、ascent、baseline、descent、bottom 和领先的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27631736/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com