• category: swing folder: Tracking title: Fontにトラッキングを設定して文字列幅を詰めて描画する tags: [Font, TextAttribute, JLabel] author: aterai pubdate: 2020-08-17T00:41:09+09:00 description: Fontに負のトラッキング値(字送り、文字間)を設定して文字列幅を縮小して描画します。 image: https://drive.google.com/uc?id=1KrgIAqBBGNrvhJlqL9rWcKfeuNkTCktC

概要

Fontに負のトラッキング値(字送り、文字間)を設定して文字列幅を縮小して描画します。

サンプルコード

protected Shape getTextShape(Graphics2D g2) {
  String txt = getText();
  Map<TextAttribute, Object> attr = new ConcurrentHashMap<>();
  attr.put(TextAttribute.TRACKING, -.1f);
  Font font = txt.length() < 3 ? g2.getFont() : g2.getFont().deriveFont(attr);
  FontRenderContext frc = g2.getFontRenderContext();
  return new TextLayout(txt, font, frc).getOutline(null);
}
View in GitHub: Java, Kotlin

解説

  • Default (0)
    • トラッキング値のデフォルト値は0
  • TRACKING_TIGHT (-.04f)
    • 密なトラッキング値で実際の値は-0.04f
  • TRACKING_LOOSE (.04f)
    • 疎なトラッキング値で実際の値は0.04f
  • Scaled along the X axis direction: 0.95
  • Tracking: -0.1
    • 3文字以上の場合Map#put(TextAttribute.TRACKING, -.1f)で字送りを10%詰めたフォントをFont#deriveFont(Map<? extends Attribute, ?>)で複製して使用
    • TextAttribute.KERNINGTextAttribute.KERNING_ONにして文字詰めする方法もあるが、フォントに欧文ペアカーニング情報が含まれていない場合は効果がない

参考リンク

コメント