[解決済み] AndroidのFontMetricsにおけるtop, ascent, baseline, descent, bottom, leadingの意味するところ
質問
基本的な質問のようですが、SOで似たようなものを見つけられませんでした。を読んでいるときに
ドキュメントを読んでいるとき
を読んでいる間、私はコンセプトを把握するのに苦労していました。私は、次のような違いがあることを理解したいのです。
top
と
ascent
で、さらに
bottom
と
descent
. また、ベースラインは具体的にどこにあるのでしょうか?可視化するための図はありますか?
どのように解決するのですか?
まず ドキュメントに書かれている :
- トップ - 与えられたテキストサイズにおいて、フォント内で最も背の高いグリフがベースラインから離れる最大の距離。
- 上昇 - シングルスペース・テキストに推奨されるベースラインからの距離。
- 下降 - シングルスペース・テキストに推奨されるベースラインからの距離。
- ボトム - 与えられたテキストサイズにおいて、フォント内の最も低いグリフがベースラインから下にある場合の最大距離。
- リード線 - テキストの行間に追加する推奨スペース。
なお ベースライン は、最初の 4 つが測定されるものです。これは ライン を形成するものです。 ベース を形成するもので、文字によっては(g、y、jなど)行の下に入る部分があっても、テキストはその上に置かれます。これは、裏打ちされたノートの上に書く線に相当します。
これらのことを視覚化するために、絵を示します。
JavaやAndroidでキャンバスに描画する場合、下に行くのは
増加
で、上に行くのは
減少
である。つまり、FontMetrics の
top
と
ascent
はベースラインからの距離なので負の数である(一方、descent と bottom は正の数である)。したがって
top
から
bottom
を行う必要があります(
bottom
-
top
).
は
リーディング
とは、ある行の最下部と次の行の最上部の間の距離のことです。上の絵では、1行目のオレンジと2行目の紫の間のスペースです。メジャートム(@MajorTom)のように
は以下のように記しています。
タイポグラフィでは、この用語は「連続する活字のベースライン間の距離」としてより適切に定義されています。
*
しかし、Androidはより歴史的な意味でこの言葉を使用しているようです。この単語 (発音は "ledding") は、昔の植字工が活字の行間に置いた鉛片に由来しています。基本的には、行間を調整するためのものでした。Androidでは、リーディングが次のようなものであるのを見たことがありません。
0
となっているのを見たことがありませんし、ソースコードの中で何かに使われているのも見たことがありません。(どこで何かの計算に使われているか知っていたら訂正してください。) 行間を変更するのは
TextView
で
setLineSpacing
をコードで記述するか
android:lineSpacingExtra
そして
android:lineSpacingMultiplier
をxmlで記述します。
これらのメソッドは
は,しかし,リーディングを利用したり変更したりすることはない。
より詳細な情報については、これらのリンクをチェックしてください。
- Android の精密なテキスト描画
- Java (および Android) におけるフォントメトリック
- レイアウトのドキュメント
- Javaを使用しています。FontMetrics の上昇値が正しくありません。
- アンドロイド端末で実行すると、フォントメトリクスが正しく表示されません。シミュレータでは問題なし
-
Java フォント メトリック
(Javaでは
top
とbottom
)
もっと見る
Font Metricsをより深く知るために、簡単なプロジェクトを作りました。
ここにすべてのコードを列挙するよりも I を GitHub に追加しました。 . プロジェクトをクローンするか、以下のファイルを新しいプロジェクトにコピーしてください。
文字が上に行くことはありますか?
top
または
bottom
?
通常はそうではありませんが、可能性はあります。私が理解しているように、トップとボトムはフォントによって設定されます (それゆえ "FontMetrics")、したがって、フォント メーカーはグリフを、彼らが言うトップよりも高く (またはボトムよりも低く) することができます。また ダイアクリティカルマークを組み合わせる をユニコードで使う場合、これは非常に容易に起こり得ます。以下は、かなり極端な例です (以下は ここで ): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
この文字列をAndroidに突っ込むと、こうなります。
ダイアクリティカルマークは
top
の下、そして
bottom
. しかし、全体の幅と高さがテキスト境界によって正しく測定されることは興味深いことです。
とにかく、プログラミングにおけるすべての実用的な目的のために、グリフ文字の最大と最小は次のように仮定すればよいでしょう。
top
であり
bottom
. そして通常、それらは
ascent
と
descent
. 何らかの理由で、文字が
top
または
bottom
を使用することができます。
TextPaint.getTextBounds
.
関連
-
[解決済み] AndroidViewModel と ViewModel の比較
-
[解決済み] compileSdkVersionとtargetSdkVersionの違いは何ですか?
-
[解決済み] getContext() , getApplicationContext() , getBaseContext() と "this" との相違点
-
[解決済み] Gradleの実装とAPIの設定
-
[解決済み】なぜビルドタイプとプロダクトフレーバーは別物なのですか?
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] Androidの環境設定。ユーザーが環境設定画面を使用していない場合、デフォルト値を読み込むにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] キャンバス上に描画されるテキストの高さを計測する(Android)
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] Android Navigation Architecture Component - 現在表示されているフラグメントを取得する
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] Android APKファイルの中身を見るには?