1. ホーム
  2. android

[解決済み] AndroidのFontMetricsにおけるtop, ascent, baseline, descent, bottom, leadingの意味するところ

2022-12-21 22:05:06

質問

基本的な質問のようですが、SOで似たようなものを見つけられませんでした。を読んでいるときに ドキュメントを読んでいるとき を読んでいる間、私はコンセプトを把握するのに苦労していました。私は、次のような違いがあることを理解したいのです。 topascent で、さらに bottomdescent . また、ベースラインは具体的にどこにあるのでしょうか?可視化するための図はありますか?

どのように解決するのですか?

まず ドキュメントに書かれている :

  • トップ - 与えられたテキストサイズにおいて、フォント内で最も背の高いグリフがベースラインから離れる最大の距離。
  • 上昇 - シングルスペース・テキストに推奨されるベースラインからの距離。
  • 下降 - シングルスペース・テキストに推奨されるベースラインからの距離。
  • ボトム - 与えられたテキストサイズにおいて、フォント内の最も低いグリフがベースラインから下にある場合の最大距離。
  • リード線 - テキストの行間に追加する推奨スペース。

なお ベースライン は、最初の 4 つが測定されるものです。これは ライン を形成するものです。 ベース を形成するもので、文字によっては(g、y、jなど)行の下に入る部分があっても、テキストはその上に置かれます。これは、裏打ちされたノートの上に書く線に相当します。

これらのことを視覚化するために、絵を示します。

JavaやAndroidでキャンバスに描画する場合、下に行くのは 増加 で、上に行くのは 減少 である。つまり、FontMetrics の topascent はベースラインからの距離なので負の数である(一方、descent と bottom は正の数である)。したがって top から bottom を行う必要があります( bottom - top ).

リーディング とは、ある行の最下部と次の行の最上部の間の距離のことです。上の絵では、1行目のオレンジと2行目の紫の間のスペースです。メジャートム(@MajorTom)のように は以下のように記しています。 タイポグラフィでは、この用語は「連続する活字のベースライン間の距離」としてより適切に定義されています。 * しかし、Androidはより歴史的な意味でこの言葉を使用しているようです。この単語 (発音は "ledding") は、昔の植字工が活字の行間に置いた鉛片に由来しています。基本的には、行間を調整するためのものでした。Androidでは、リーディングが次のようなものであるのを見たことがありません。 0 となっているのを見たことがありませんし、ソースコードの中で何かに使われているのも見たことがありません。(どこで何かの計算に使われているか知っていたら訂正してください。) 行間を変更するのは TextView setLineSpacing をコードで記述するか android:lineSpacingExtra そして android:lineSpacingMultiplier をxmlで記述します。 これらのメソッドは は,しかし,リーディングを利用したり変更したりすることはない。

より詳細な情報については、これらのリンクをチェックしてください。

もっと見る

Font Metricsをより深く知るために、簡単なプロジェクトを作りました。

ここにすべてのコードを列挙するよりも I を GitHub に追加しました。 . プロジェクトをクローンするか、以下のファイルを新しいプロジェクトにコピーしてください。

文字が上に行くことはありますか? top または bottom ?

通常はそうではありませんが、可能性はあります。私が理解しているように、トップとボトムはフォントによって設定されます (それゆえ "FontMetrics")、したがって、フォント メーカーはグリフを、彼らが言うトップよりも高く (またはボトムよりも低く) することができます。また ダイアクリティカルマークを組み合わせる をユニコードで使う場合、これは非常に容易に起こり得ます。以下は、かなり極端な例です (以下は ここで ): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

この文字列をAndroidに突っ込むと、こうなります。

ダイアクリティカルマークは top の下、そして bottom . しかし、全体の幅と高さがテキスト境界によって正しく測定されることは興味深いことです。

とにかく、プログラミングにおけるすべての実用的な目的のために、グリフ文字の最大と最小は次のように仮定すればよいでしょう。 top であり bottom . そして通常、それらは ascentdescent . 何らかの理由で、文字が top または bottom を使用することができます。 TextPaint.getTextBounds .