29

Android の文字間の間隔を調整する方法はありTextViewますか? これは通常「カーニング」と呼ばれていると思います。

私はandroid:textScaleX属性を認識していますが、それは文字を間隔とともに圧縮します。

4

12 に答える 12

14

CharSequenceを使用せずに任意の文字列にカーニングを適用する簡単な方法 (技術的には ) を誰かが探している場合TextView:

public static Spannable applyKerning(CharSequence src, float kerning)
{
    if (src == null) return null;
    final int srcLength = src.length();
    if (srcLength < 2) return src instanceof Spannable
                              ? (Spannable)src
                              : new SpannableString(src);

    final String nonBreakingSpace = "\u00A0";
    final SpannableStringBuilder builder = src instanceof SpannableStringBuilder
                                           ? (SpannableStringBuilder)src
                                           : new SpannableStringBuilder(src);
    for (int i = src.length() - 1; i >= 1; i--)
    {
        builder.insert(i, nonBreakingSpace);
        builder.setSpan(new ScaleXSpan(kerning), i, i + 1,
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return builder;
}
于 2013-11-29T19:59:04.853 に答える
12

AFAIK、でカーニングを調整することはできませんTextViewCanvas2DグラフィックAPIを使用して自分でテキストを描画すると、カーニングを調整できる場合があります。

于 2009-10-29T14:18:27.583 に答える
3

カーニングを調整する唯一の方法は、グリフ アドバンスが変更されたカスタム フォントを作成することです。

于 2013-01-10T11:01:13.810 に答える
1

SpannedStringを使用することもできますが、それを解析して各単語の文字間隔を変更する必要があります

于 2011-01-25T23:27:34.077 に答える
0

@PedroBarros の回答を使用したかったのですが、間隔をピクセル単位で定義する必要がありました。

applySpacing メソッドの編集は次のとおりです。

private void applySpacing() {
    if (this == null || this.originalText == null) return;

    Paint testPaint = new Paint();
    testPaint.set(this.getPaint());
    float spaceOriginalSize = testPaint.measureText("\u00A0");
    float spaceScaleXFactor = ( spaceOriginalSize > 0 ? spacing/spaceOriginalSize : 1);

    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < originalText.length(); i++) {
        builder.append(originalText.charAt(i));
        if(i+1 < originalText.length()) {
            builder.append("\u00A0");
        }
    }
    SpannableString finalText = new SpannableString(builder.toString());
    if(builder.toString().length() > 1) {
        for(int i = 1; i < builder.toString().length(); i+=2) {
            finalText.setSpan(new ScaleXSpan(spaceScaleXFactor), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    super.setText(finalText, BufferType.SPANNABLE);
}

私は Android 開発者として初心者です。これが良くない場合は、お気軽にお知らせください。

于 2015-10-20T18:57:41.520 に答える
0

@Pedro Barrosの回答の小さな編集があります。SpannableString を使用して設定すると便利です。たとえば、一部の文字の色を変えたい場合などです。

private void applySpacing() {
    SpannableString finalText;

    if (!(originalText instanceof SpannableString)) {
        if (this.originalText == null) return;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < originalText.length(); i++) {
            builder.append(originalText.charAt(i));
            if (i + 1 < originalText.length()) {
                builder.append("\u00A0");
            }
        }
        finalText = new SpannableString(builder.toString());
    } else {
        finalText = (SpannableString) originalText;
    }

    for (int i = 1; i < finalText.length(); i += 2) {
        finalText.setSpan(new ScaleXSpan((spacing + 1) / 10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    super.setText(finalText, TextView.BufferType.SPANNABLE);
}
于 2015-10-01T09:44:40.320 に答える