これは基本的な質問のようですが、SOで同様の質問を見つけることができませんでした。ドキュメントを読んでいる間、私は概念を理解するのに苦労していました。私は違いが間にあるかを理解したいtop
とascent
しても、bottom
とdescent
。そして、ベースラインは正確にどこにありますか?視覚化するのに役立つ図はありますか?
回答:
まず、ドキュメントの内容を確認しましょう。
ベースラインは最初の4つが測定されるものであることに注意してください。これは、あるラインを形成ベースを(G、Y、J、などのような)一部の文字が線の下に行くの部分を持っている場合でも、テキストが上に座っていること。それはあなたが裏打ちされたノートに書く線に匹敵します。
これらを視覚化するのに役立つ写真を次に示します。
JavaとAndroidでキャンバスに描画する場合、下がるとyが増加し、上に行くとyが減少することに注意してください。つまり、FontMetricsのtop
とascent
はベースラインから測定されるため負の数です(descentとbottomは正の数です)。したがって、からの距離を取得するtop
にbottom
(あなたがする必要があるだろうがbottom
- top
)。
先頭は、 1つのラインの底部と次の行の先頭との間の距離です。上の図では、1行目のオレンジと2行目の紫色の間のスペースです。以下で説明する@MajorTomのように、タイポグラフィでは、この用語は「連続するタイプの行のベースライン間の距離」としてより適切に定義されます。*ただし、Androidはより歴史的な意味でこの用語を使用しているようです。この単語(「レディング」と発音)は、古いタイプセッターがタイプの行の間に配置するために使用したリードストリップに由来します。これは基本的に、行間隔を調整するための単なる方法でした。Androidでは、リードが他のものであるのを実際に見たことがありません0
そして私はそれがソースコードの何にも使われているのを見たことがありません。(正しい私にそれが計算何にも使用されている場所を知っていれば。)あなたには、行間隔を変更することができますTextView
とsetLineSpacing
、コード内またはandroid:lineSpacingExtra
およびandroid:lineSpacingMultiplier
XMLで。ただし、これらのメソッドは、先頭を使用または変更しません。
詳細については、次のリンクを確認してください。
top
とbottom
)フォントメトリクスをさらに詳しく調べるために、簡単なプロジェクトを作成しました。
ここにすべてのコードをリストするのではなく。プロジェクトをGitHubに追加しました。プロジェクトのクローンを作成するか、次のファイルを新しいプロジェクトにコピーすることができます。
top
または下に移動することはありますbottom
か?通常ではありませんが、可能です。上部と下部は、私が理解しているように、フォント(したがって、「FontMetrics」)によって設定されるため、フォントメーカーは、上部が何であるかよりも高く(または下部よりも低く)グリフを作成できます。また、Unicodeで発音区別符号を組み合わせると、非常に簡単に発生する可能性があります。これはかなり極端な例です(ここから取得)):?!M̵̳̙͔̟͕̓̄̉̅ͧ̋͊͌͑͌ͪ̒̿̚a͔̟̝͔ͥ̈̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩͈͕̼̣͕̟̌͗̾ͤ͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈͡͠e̵ͯͪ̿̿̄ͫ҉͏͎̣̹̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭̣̞͙͚̝̰̞̹̗̣͙͍͍̓͊̋ͣ̏̑̍̊͌ͩ͐ͣͣ̚͟͟h̛͋̏̍̆ͤ͛͐ͨ̌̋ͤͨ̓̑̚̕͟͏̻̣͖̖͚͚͓̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ṱ̼̖̓ͭ̏̅ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̡̪̬͎͍̥̬̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛͝帽子̶̨̡͇͚̙͚̭̣̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑͡
その文字列をAndroidに接続すると、次のようになります。
分音記号は、の上と下にtop
ありますbottom
。ただし、幅と高さの合計はテキストの境界によって正しく測定されることに注意してください。
とにかく、あなたのプログラミングのすべての実用的な目的のために、あなただけのグリフ文字の最大と最小であると仮定することができますtop
とbottom
。そして、通常、彼らは内にとどまるだろうascent
とdecent
。何らかの理由で文字が超えているかどうかを確実に知る必要がある場合、top
またはbottom
を使用できる場合TextPaint.getTextBounds
。
Top
ますか、正確には何ですか?Top
線に触れるのに十分な高さの文字はありますか?たとえば、「M」、「l」は最も高い文字のようです。それらのどれも触れていませんTop
。
リーディングは、タイポグラフィの行間のスペースではありません。どうやらこれはAndroidコードが考慮していないものです。私たちはこれに自分たちで苦労してきました。リーディングの適切な定義(ウィキペディアから):
タイポグラフィでは、先頭の/ ˈlɛdɪŋ /は、タイプの連続する行のベースライン間の距離を指します。この用語は、タイプの線の間の垂直距離を増やすために鉛の薄いストリップがフォームに挿入された、手で植字された時代に由来しました。
私の知る限り、Androidにはこれを指定する方法がありません。
setLineSpacing
コードまたはandroid:lineSpacingExtra
およびandroid:lineSpacingMultiplier
XMLで。
android:lineSpacingExtra
間の実際のスペースの間に測定値を置くことを使用するように言われました。リードしているわけではありませんが、間隔を管理する唯一の方法のようです。タイポグラフィにはそのような測定値がなく、SketchまたはZepelin(私たちが使用するツール)でその測定値を指定する方法がないため、これは問題です。加えて、それはリーディングと一致しません。