100

これは基本的な質問のようですが、SO で同様の質問が見つかりませんでした。ドキュメントを読んでいる間、概念を理解するのに苦労しました。topと とascentbottomの違いを理解したいですdescent。そして、ベースラインは正確にどこにありますか? 視覚化するのに役立つ図はありますか?

4

2 に答える 2

324

まず、ドキュメントの内容を確認しましょう:

  • - 特定のテキスト サイズでのフォントの最も高いグリフのベースラインからの最大距離。
  • Ascent - シングル スペース テキストのベースラインからの推奨距離。
  • ディセント- 単一間隔テキストのベースラインからの推奨距離。
  • Bottom - 所定のテキスト サイズでのフォントの最も低いグリフのベースラインから下の最大距離。
  • Leading - テキストの行間に追加する推奨の追加スペース。

ベースラインは、最初の 4 つが測定されるものであることに注意してください。一部の文字 (g、y、j など) にはの下にある部分がある場合でも、テキストが置かれるベースを形成するのは行です。罫線入りのノートに書いた線に匹敵します。

これらを視覚化するのに役立つ図を次に示します。

上位、上昇、ベースライン、まとも、下位、および先行を示す FontMetrics

Java と Android でキャンバスに描画する場合、下に行くと yが増加し、上に行くと yが減少することに注意してください。つまり、FontMetrics のtopascentはベースラインから測定されるため、負の数値になります (下降と下降は正の数値です)。したがって、 から までの距離を取得するには ( - )topbottom実行する必要があります。bottomtop

行送りは、ある行の下端と次の行の上端の間の距離です。上の図では、ライン 1 のオレンジ色とライン 2 の紫色の間のスペースです。 @MajorTomが以下に記したように、タイポグラフィでは、この用語は「タイプの連続するラインのベースライン間の距離」としてより適切に定義されています。*ただし、Android ではこの用語をより歴史的な意味で使用しているようです。(「レッディング」と発音される) という言葉は、昔のタイプセッターが活字の行間に置いていた鉛の帯に由来します。これは基本的に、行間を調整するための単なる方法でした。Androidでは、主役が0ソースコードでそれが使用されているのを見たことがありません。(何かを計算するためにどこで使用されているかを知っていれば、私を修正してください。) 行間隔は、TextViewコードsetLineSpacing内またはxmlandroid:lineSpacingExtraで変更できます。ただし、これらのメソッドは、リーディングを使用したり変更したりしません。android:lineSpacingMultiplier

詳細については、次のリンクを参照してください。

もっと調べる

Font Metrics をさらに詳しく調べるために、簡単なプロジェクトを作成しました。

ここに画像の説明を入力

ここにすべてのコードをリストするのではなく。プロジェクトを GitHubに追加しました。プロジェクトを複製するか、次のファイルを新しいプロジェクトにコピーできます。

文字が上下に移動することはありtopますbottomか?

通常はそうではありませんが、可能です。私が理解しているように、上と下はフォントによって設定されるため(したがって「FontMetrics」)、フォントメーカーはグリフを上と言うよりも高く(または下よりも低く)することができます。また、 Unicode で分音記号を組み合わせると、非常に簡単に発生する可能性があります。これはかなり極端な例です(ここから取得):m̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯa ͔̟̝͔ͥ̈́̏ͮͯy̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾'e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬?

その文字列を Android にプラグインすると、次のようになります。

ここに画像の説明を入力

分音記号は の上と下にtopありますbottom。ただし、幅と高さの合計がテキスト境界によって正しく測定されていることに注意してください。

とにかく、プログラミングの実際的な目的のために、グリフ文字の最大値と最小値は と であると想定できtopますbottom。通常、それらは と の範囲内に留まりascentますdescent。何らかの理由で、文字が超えているかどうかを確実に知る必要がある場合、topまたはbottom使用できるTextPaint.getTextBounds.

于 2014-12-24T05:01:01.777 に答える
5

行送りは、タイポグラフィの行間のスペースではありません。どうやら、これは Android コードでは考慮されていないことです。私たちはこれに苦労してきました。先頭の適切な定義 (ウィキペディアから):

タイポグラフィでは、先頭の /ˈlɛdɪŋ/ は、タイプの連続する行のベースライン間の距離を指します。この用語は、タイプの行間の垂直距離を増やすために鉛の薄いストリップがフォームに挿入された、手作業で植字された時代に始まりました。

私が知る限り、Android にはこれを指定する方法がありません。

于 2016-06-10T18:13:13.793 に答える