web-dev-qa-db-fra.com

Comment changer l'espacement des lettres dans une Textview?

Comment puis-je changer l'espacement des lettres dans un textview? Est-ce que ça va aider si j'ai du texte HTML dedans (je ne peux pas utiliser webview dans mon code).

P.S. J'utilise mon propre caractère dans textview avec du texte HTML.

103
OkyDokyman

vérifier Android: textScaleX

En fonction de l'espacement dont vous avez besoin, cela pourrait aider. C'est la seule chose qui concerne à distance l'espacement des lettres dans TextView.

Edit: voir réponse de @ JerabekJakub ci-dessous pour une méthode plus à jour et meilleure pour le faire à partir de api 21 (Sucette)

19
zrgiu

Depuis l’API 21, il existe un jeu d’options d’espacement des lettres. Vous pouvez appeler la méthode setLetterSpacing ou la définir en XML avec l'attribut letterSpacing .

208
JerabekJakub

Cette réponse est basée sur la réponse de Pedro mais ajustée pour fonctionner aussi si l'attribut textuel est déjà défini:

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;
    }
}

Si vous voulez l'utiliser par programme:

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);
26
Bart Burg

Plus d'espace:

  Android:letterSpacing="0.1"

Moins d'espace:

 Android:letterSpacing="-0.07"
21
Pablo Cegarra

après API> = 21, il existe une méthode inbuild fournie par TextView appelée setLetterSpacing

cochez cette case pour plus

11
Ravi Rupareliya

J'ai construit une classe personnalisée qui étend TextView et résout ce problème ... Regardez ma réponse ici =)

9
Pedro Barros

Comme Android ne supporte pas une telle chose, vous pouvez le faire manuellement avec FontCreator. Il a de bonnes options pour la modification des polices. J'ai utilisé cet outil pour créer une police personnalisée, même si fois, mais vous pouvez toujours l’utiliser dans vos projets.

0
Ali