Як змінити інтервал між літерами в Textview?


127

Як я можу змінити інтервал між літерами в текстовому перегляді? Чи допоможе це, якщо у мене є текст HTML (я не можу використовувати веб-перегляд у своєму коді).

PS Я використовую власний шрифт у текстовому перегляді з текстом HTML.


5
У редакторі макетів ви можете зробити android:letterSpacing=".05"Where .05 буде приблизно "50" в такій програмі, як Photoshop
Jacksonkr

Відповіді:


26

перевірити Android: textScaleX

Залежно від необхідного інтервалу, це може допомогти. Це єдине, що віддалено пов'язане з інтервалом літер у TextView.

Редагувати: дивіться відповідь @ JerabekJakub нижче для оновленого, кращого способу зробити це, починаючи з api 21 (Lollipop)


9
Як би ви перевели це на інтервал між літерами?
Ерік Новінс

92
Чи є спосіб збільшити / зменшити пробіл між літерами / символами? textScaleX - літературне масштабування літер / символів.
Kaymatrix

2
@Barts відповідь робить те, що задає питання
bkurzius

2
Масштабування тексту на осі X - це не правильний спосіб керування кернінгом або відстеженням в Android. Існує api для льодяника, який виконує це, однак попередній для льодяника вам потрібен спеціальний перегляд тексту, щоб досягти цього.
Елліотт

2
Я не знаю, як за це рішення набрали стільки відгуків (+33, -24), чи люди просто сліпо подають голоси? letterSpacingпроти textScaleXякої величезної різниці
Джиміт Патель

230

З API 21 існує опція встановлення інтервалу літер. Ви можете викликати метод setLetterSpacing або встановити його в XML за допомогою атрибута letterSpacing .


1
Це насправді не працює, коли встановлено в XML. Я отримую таку помилку:"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman

20
@dopatraman Ви повинні опустити одиниці, введіть просто значення: android: letterSpacing = "1.2" замість android: letterSpacing = "1.2dp"
JerabekJakub

12
Знаючи, що 31% пристроїв не підтримують API 21, як би ви це зробили в попередніх версіях?
ninjaneer

25
Зауважте, що значення LetSpacing не в dp / sp, а в одиницях 'EM'. Типові значення незначного розширення становитимуть близько 0,05. Негативні значення підтягують текст.
Крістан

25
Чомусь letterSpacingне змінився в попередньому перегляді AS. Мені довелося фактично запустити додаток на фізичному пристрої, щоб побачити зміни.
Дрю Шурко

46

Більше місця:

  android:letterSpacing="0.1"

Менше місця:

 android:letterSpacing="-0.07"

2
що таке літер за замовчуваннямSpacing?
Шиви

3
За замовчуванням letterSpacing- 0,0 відповідно до developer.android.com/reference/android/widget/…
Evin1_

можливо додати коментар @ Evin1_ в ур відповіді
Sarthak Mittal

що підтримується максимальний та мінімальний розмір літер?
Jimit Patel

26

Ця відповідь заснована на відповіді Педро, але скоригована, тому вона також працює, якщо текстовий атрибут вже встановлений:

package nl.raakict.android.spc.widget;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ScaleXSpan;
import android.util.AttributeSet;
import android.widget.TextView;


public class LetterSpacingTextView extends TextView {
    private float letterSpacing = LetterSpacing.BIGGEST;
    private CharSequence originalText = "";


    public LetterSpacingTextView(Context context) {
        super(context);
    }

    public LetterSpacingTextView(Context context, AttributeSet attrs){
        super(context, attrs);
        originalText = super.getText();
        applyLetterSpacing();
        this.invalidate();
    }

    public LetterSpacingTextView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public float getLetterSpacing() {
        return letterSpacing;
    }

    public void setLetterSpacing(float letterSpacing) {
        this.letterSpacing = letterSpacing;
        applyLetterSpacing();
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        originalText = text;
        applyLetterSpacing();
    }

    @Override
    public CharSequence getText() {
        return originalText;
    }

    private void applyLetterSpacing() {
        if (this == null || this.originalText == null) return;
        StringBuilder builder = new StringBuilder();
        for(int i = 0; i < originalText.length(); i++) {
            String c = ""+ originalText.charAt(i);
            builder.append(c.toLowerCase());
            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((letterSpacing+1)/10), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        super.setText(finalText, BufferType.SPANNABLE);
    }

    public class LetterSpacing {
        public final static float NORMAL = 0;
        public final static float NORMALBIG = (float)0.025;
        public final static float BIG = (float)0.05;
        public final static float BIGGEST = (float)0.2;
    }
}

Якщо ви хочете використовувати його програмно:

LetterSpacingTextView textView = new LetterSpacingTextView(context);
textView.setSpacing(10); //Or any float. To reset to normal, use 0 or LetterSpacingTextView.Spacing.NORMAL
textView.setText("My text");
//Add the textView in a layout, for instance:
((LinearLayout) findViewById(R.id.myLinearLayout)).addView(textView);

це додане насправді пробіли між символами? Бу ... якщо хтось скопіює цей текст, він буде містити додаткові пробіли. No-Joy
johnw182

Потрібен nullзаїзд applyLetterSpacing, але крім цього, рятувальник життя!
Барт ван Нієроп

не працює, коли ви встановлюєте текстові післямови, а потім застосовуєте пробіли програмно
Джонатан

@jonney це повинно, у мене це працює так. Чи можете ви надіслати приклад?
Барт-Бургас

1
Простір без перерви - "\ u00A0" - справді корисний. Спасибі
Shayan_Aryan

11

після API> = 21 існує метод вбудовування, який надає TextView під назвою setLetterSpacing

перевірте це на детальніше


3
Як можна те ж саме в <21?
Рахул Деванавар

2
if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP) {this.setLetterSpacing (getResources (). getDimension (R.dimen.letter_spacing)); } else {this.setTextScaleX (getResources (). getDimension (R.dimen.letter_spacing)); }
Маулік Патель


0

Оскільки Android не підтримує подібне, ви можете це зробити вручну за допомогою FontCreator. Він має хороші варіанти для зміни шрифту. Я використовував цей інструмент для створення спеціального шрифту, навіть якщо це займає кілька разів, але ви завжди можете використовувати його у своїх проектах.


-1

Для вбудовування тексту HTML у текстове перегляд ви можете використовувати Html.fromHTML()синтаксис. Більше інформації ви отримаєте від http://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29


1
як це допомагає? Мені невідомий тег HTML для інтервалу літер, який працює в TextView.
k2col
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.