これは基本的な質問のようですが、SO で同様の質問が見つかりませんでした。ドキュメントを読んでいる間、概念を理解するのに苦労しました。top
と とascent
とbottom
の違いを理解したいですdescent
。そして、ベースラインは正確にどこにありますか? 視覚化するのに役立つ図はありますか?
2 に答える
まず、ドキュメントの内容を確認しましょう:
- 上- 特定のテキスト サイズでのフォントの最も高いグリフのベースラインからの最大距離。
- Ascent - シングル スペース テキストのベースラインからの推奨距離。
- ディセント- 単一間隔テキストのベースラインからの推奨距離。
- Bottom - 所定のテキスト サイズでのフォントの最も低いグリフのベースラインから下の最大距離。
- Leading - テキストの行間に追加する推奨の追加スペース。
ベースラインは、最初の 4 つが測定されるものであることに注意してください。一部の文字 (g、y、j など) には行の下にある部分がある場合でも、テキストが置かれるベースを形成するのは行です。罫線入りのノートに書いた線に匹敵します。
これらを視覚化するのに役立つ図を次に示します。
Java と Android でキャンバスに描画する場合、下に行くと yが増加し、上に行くと yが減少することに注意してください。つまり、FontMetrics のtop
とascent
はベースラインから測定されるため、負の数値になります (下降と下降は正の数値です)。したがって、 から までの距離を取得するには ( - )top
をbottom
実行する必要があります。bottom
top
行送りは、ある行の下端と次の行の上端の間の距離です。上の図では、ライン 1 のオレンジ色とライン 2 の紫色の間のスペースです。 @MajorTomが以下に記したように、タイポグラフィでは、この用語は「タイプの連続するラインのベースライン間の距離」としてより適切に定義されています。*ただし、Android ではこの用語をより歴史的な意味で使用しているようです。(「レッディング」と発音される) という言葉は、昔のタイプセッターが活字の行間に置いていた鉛の帯に由来します。これは基本的に、行間を調整するための単なる方法でした。Androidでは、主役が0
ソースコードでそれが使用されているのを見たことがありません。(何かを計算するためにどこで使用されているかを知っていれば、私を修正してください。) 行間隔は、TextView
コードsetLineSpacing
内またはxmlandroid:lineSpacingExtra
で変更できます。ただし、これらのメソッドは、リーディングを使用したり変更したりしません。android:lineSpacingMultiplier
詳細については、次のリンクを参照してください。
- 正確な Android テキスト描画
- Java (および Android) のフォント メトリック
- レイアウトのドキュメント
- Java: FontMetrics のアセントが正しくない?
- Android デバイスで実行すると、FontMetrics が正しくありません。シミュレーターファイン
- Java Font Metrics
top
(Java はandを使用していないようですbottom
)
もっと調べる
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
.
行送りは、タイポグラフィの行間のスペースではありません。どうやら、これは Android コードでは考慮されていないことです。私たちはこれに苦労してきました。先頭の適切な定義 (ウィキペディアから):
タイポグラフィでは、先頭の /ˈlɛdɪŋ/ は、タイプの連続する行のベースライン間の距離を指します。この用語は、タイプの行間の垂直距離を増やすために鉛の薄いストリップがフォームに挿入された、手作業で植字された時代に始まりました。
私が知る限り、Android にはこれを指定する方法がありません。