AndroidのFontMetricsでのtop、ascent、baseline、descent、bottom、leadingの意味


90

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

回答:


287

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

  • -指定されたテキストサイズでのフォントの最も高いグリフのベースラインからの最大距離。
  • 上昇-単一間隔のテキストのベースラインより上の推奨距離。
  • 降下-単一間隔のテキストのベースラインより下の推奨距離。
  • -指定されたテキストサイズでのフォントの最小グリフのベースラインより下の最大距離。
  • 先頭-テキストの行の間に追加する推奨される追加スペース。

ベースラインは最初の4つが測定されるものであることに注意してください。これは、あるラインを形成ベースを(G、Y、J、などのような)一部の文字が線の下に行くの部分を持っている場合でも、テキストが上に座っていること。それはあなたが裏打ちされたノートに書く線に匹敵します。

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

トップ、アセント、ベースライン、ディセント、ボトム、リーディングを示すFontMetrics

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

先頭は、 1つのラインの底部と次の行の先頭との間の距離です。上の図では、1行目のオレンジと2行目の紫色の間のスペースです。以下で説明する@MajorTomのように、タイポグラフィでは、この用語は「連続するタイプの行のベースライン間の距離」としてより適切に定義されます。*ただし、Androidはより歴史的な意味でこの用語を使用しているようです。この単語(「レディング」と発音)は、古いタイプセッターがタイプの行の間に配置するために使用したリードストリップに由来します。これは基本的に、行間隔を調整するための単なる方法でした。Androidでは、リードが他のものであるのを実際に見たことがありません0そして私はそれがソースコードの何にも使われているのを見たことがありません。(正しい私にそれが計算何にも使用されている場所を知っていれば。)あなたには、行間隔を変更することができますTextViewsetLineSpacing、コード内またはandroid:lineSpacingExtraおよびandroid:lineSpacingMultiplierXMLで。ただし、これらのメソッドは、先頭を使用または変更しません。

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

詳細を見る

フォントメトリクスをさらに詳しく調べるために、簡単なプロジェクトを作成しました。

ここに画像の説明を入力してください

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

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

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

その文字列をAndroidに接続すると、次のようになります。

ここに画像の説明を入力してください

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

とにかく、あなたのプログラミングのすべての実用的な目的のために、あなただけのグリフ文字の最大と最小であると仮定することができますtopbottom。そして、通常、彼らは内にとどまるだろうascentdecent。何らかの理由で文字が超えているかどうかを確実に知る必要がある場合、topまたはbottomを使用できる場合TextPaint.getTextBounds


いいね!上昇、下降などがどの単位で測定されているか知っていますか?それらはピクセル単位ですか?これらは浮動小数点値ですが、画面にどのように対応しているかはわかりません。フォトショップでチェックしてもらい、ピクセルであり、数単位のわずかな違いがあるかどうかを確認しました。ピクセルが小さい。
Vikram Gupta

@VikramGupta。単位はピクセルです。フォトショップの画像チェックとの違いの原因がわかりません。
suragch 2017

便利な説明とアプリをありがとう。しかし、あなたはさらに説明できTopますか、正確には何ですか?Top線に触れるのに十分な高さの文字はありますか?たとえば、「M」、「l」は最も高い文字のようです。それらのどれも触れていませんTop
Cheok Yan Cheng 2017

@CheokYanCheng、私の答えの最後にある更新を参照してください。
suragch 2017

@Suragch情報をありがとう。私はあなたのアプリを使ってもっと理解しています。「Ascent」の行は、スクリーンショットのようにフォントの上部にうまく触れると思います。ただし、最新のi.imgur.com/aRxgjvu.pngからは、一番背の高い文字「M」には触れていません。理由はわかりますか?
Cheok Yan Cheng

5

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

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

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


リーディングをよりよく理解するのを助けるための+1。これまで大手を変更するとなると、あなたはのTextViewのを使用することができますsetLineSpacingコードまたはandroid:lineSpacingExtraおよびandroid:lineSpacingMultiplierXMLで。
suragch 2016年

おかげで-はい、線のandroid:lineSpacingExtra間の実際のスペースの間に測定値を置くことを使用するように言われました。リードしているわけではありませんが、間隔を管理する唯一の方法のようです。タイポグラフィにはそのような測定値がなく、SketchまたはZepelin(私たちが使用するツール)でその測定値を指定する方法がないため、これは問題です。加えて、それはリーディングと一致しません。
MajorTom 2016年

1
誤植の先頭がベースライン間の距離である場合、計算は簡単なはずです。
suragch 2016年

私もそう思っていました。プログラムでそれを行う方法はありますか?私はAndroidが提供する方法でそれを行う方法があるかもしれないと期待していました。私たちが一緒に仕事をしている開発者は知らないようです。
MajorTom 2016年

これを使ってからしばらく経ちましたが、もう一度取り上げる場合は、ここここから始め、さまざまなテキストとフォントを試してみます。簡単ではないとしても、必要なものを計算する方法がないとは信じられません。
suragch 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.