Comment changer l'espacement des lettres dans une vue textuelle?
127
Comment modifier l'espacement des lettres dans une vue de texte? Cela aidera-t-il si j'ai du texte HTML (je ne peux pas utiliser la vue Web dans mon code).
PS J'utilise ma propre police de caractères dans la vue de texte avec du texte HTML.
En fonction de l'espacement dont vous avez besoin, cela peut vous aider. C'est la seule chose liée à distance à l'espacement des lettres dans TextView.
Edit: veuillez voir la réponse de @ JerabekJakub ci-dessous pour une meilleure méthode mise à jour pour le faire en commençant par api 21 (Lollipop)
Comment traduiriez-vous cela en espacement des lettres?
Eric Novins
92
Existe-t-il un moyen d'augmenter / diminuer l'espace entre les lettres / caractères? textScaleX - Literary met à l'échelle les lettres / caractères.
Kaymatrix
2
@Barts answer fait ce que la question demande
bkurzius
2
La mise à l'échelle du texte sur l'axe X n'est pas la bonne façon de gérer le crénage ou le suivi dans Android. Il existe une API pour Lollipop qui accomplit cela, mais avant de Lollipop, vous aurez besoin d'une vue de texte personnalisée pour ce faire.
Elliott
2
Je ne sais pas comment cette solution a obtenu autant de votes positifs (+33, -24) est-ce que les gens votent aveuglément? letterSpacingvs textScaleXquelle énorme différence
Jimit Patel
230
Depuis l'API 21, il existe une option d'espacement des lettres. Vous pouvez appeler la méthode setLetterSpacing ou la définir en XML avec l'attribut letterSpacing .
Cela ne fonctionne pas réellement lorsqu'il est défini dans le XML. "1.2dp" in attribute "letterSpacing" cannot be converted to float."
J'obtiens
20
@dopatraman Vous devez omettre les unités, tapez simplement la valeur: android: letterSpacing = "1.2" au lieu de android: letterSpacing = "1.2dp"
JerabekJakub
12
Sachant que 31% des appareils ne prennent pas en charge l'API 21, comment feriez-vous cela dans les versions précédentes?
ninjaneer
25
Notez que la valeur de letterSpacing n'est pas en dp / sp, elle est en unités «EM». Les valeurs typiques pour une légère expansion seront d'environ 0,05. Les valeurs négatives resserrent le texte.
Cristan
25
Pour une raison quelconque letterSpacing, cela ne changeait pas dans l'aperçu AS. J'ai dû exécuter l'application sur un appareil physique pour voir le changement.
peut-être ajouter le commentaire de @ Evin1_ dans votre réponse
Sarthak Mittal
quel est le letterSpacing maximum et minimum pris en charge?
Jimit Patel le
26
Cette réponse est basée sur la réponse de Pedro mais ajustée afin qu'elle fonctionne également si l'attribut de texte 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;publicclassLetterSpacingTextViewextendsTextView{privatefloat letterSpacing =LetterSpacing.BIGGEST;privateCharSequence originalText ="";publicLetterSpacingTextView(Context context){super(context);}publicLetterSpacingTextView(Context context,AttributeSet attrs){super(context, attrs);
originalText =super.getText();
applyLetterSpacing();this.invalidate();}publicLetterSpacingTextView(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);}publicfloat getLetterSpacing(){return letterSpacing;}publicvoid setLetterSpacing(float letterSpacing){this.letterSpacing = letterSpacing;
applyLetterSpacing();}@Overridepublicvoid setText(CharSequence text,BufferType type){
originalText = text;
applyLetterSpacing();}@OverridepublicCharSequence getText(){return originalText;}privatevoid applyLetterSpacing(){if(this==null||this.originalText ==null)return;StringBuilder builder =newStringBuilder();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 =newSpannableString(builder.toString());if(builder.toString().length()>1){for(int i =1; i < builder.toString().length(); i+=2){
finalText.setSpan(newScaleXSpan((letterSpacing+1)/10), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}super.setText(finalText,BufferType.SPANNABLE);}publicclassLetterSpacing{publicfinalstaticfloat NORMAL =0;publicfinalstaticfloat NORMALBIG =(float)0.025;publicfinalstaticfloat BIG =(float)0.05;publicfinalstaticfloat BIGGEST =(float)0.2;}}
Si vous souhaitez l'utiliser par programme:
LetterSpacingTextView textView =newLetterSpacingTextView(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);
Comme Android ne prend pas en charge une telle chose, vous pouvez le faire manuellement avec FontCreator. Il a de bonnes options pour modifier la police. J'ai utilisé cet outil pour créer une police personnalisée, même si cela prend du temps, mais vous pouvez toujours l'utiliser dans vos projets.
android:letterSpacing=".05"
Où .05 serait à peu près "50" dans un programme comme PhotoshopRéponses:
consultez android: textScaleX
En fonction de l'espacement dont vous avez besoin, cela peut vous aider. C'est la seule chose liée à distance à l'espacement des lettres dans TextView.
Edit: veuillez voir la réponse de @ JerabekJakub ci-dessous pour une meilleure méthode mise à jour pour le faire en commençant par api 21 (Lollipop)
la source
letterSpacing
vstextScaleX
quelle énorme différenceDepuis l'API 21, il existe une option d'espacement des lettres. Vous pouvez appeler la méthode setLetterSpacing ou la définir en XML avec l'attribut letterSpacing .
la source
"1.2dp" in attribute "letterSpacing" cannot be converted to float."
letterSpacing
, cela ne changeait pas dans l'aperçu AS. J'ai dû exécuter l'application sur un appareil physique pour voir le changement.Plus d'espace:
Moins d'espace:
la source
letterSpacing
est 0.0 selon developer.android.com/reference/android/widget/…Cette réponse est basée sur la réponse de Pedro mais ajustée afin qu'elle fonctionne également si l'attribut de texte est déjà défini:
Si vous souhaitez l'utiliser par programme:
la source
null
enregistrementapplyLetterSpacing
, mais à part ça, la vie sauve!après API> = 21, il existe une méthode inbuild fournie par TextView appelée
setLetterSpacing
vérifiez ceci pour plus
la source
J'ai construit une classe personnalisée qui étend
TextView
et résout ce problème ... Découvrez ma réponse ici =)la source
Comme Android ne prend pas en charge une telle chose, vous pouvez le faire manuellement avec FontCreator. Il a de bonnes options pour modifier la police. J'ai utilisé cet outil pour créer une police personnalisée, même si cela prend du temps, mais vous pouvez toujours l'utiliser dans vos projets.
la source
Pour incorporer du texte HTML dans votre vue de texte, vous pouvez utiliser la
Html.fromHTML()
syntaxe. Vous obtiendrez plus d'informations sur http://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29la source