Как настроить кернинг текста в Android TextView? - PullRequest
25 голосов
/ 29 октября 2009

Есть ли способ отрегулировать интервал между символами в Android TextView? Я считаю, что это обычно называется "кернинг".

Мне известен атрибут android:textScaleX, но он сжимает символы вместе с пробелом.

Ответы [ 12 ]

0 голосов
/ 20 октября 2015

Я хотел использовать ответ @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, пожалуйста, дайте мне знать, если это не хорошо!

0 голосов
/ 01 октября 2015

Есть небольшая правка ответа @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);
}
...