Metin görünümünde harf aralığı nasıl değiştirilir?


127

Bir metin görünümünde harf aralığını nasıl değiştirebilirim? İçinde HTML metnim varsa yardımcı olur mu (Kodumda web görünümünü kullanamıyorum).

Not: Metin görünümünde HTML metinli kendi yazı tipimi kullanıyorum.


5
Yerleşim düzenleyicide, photoshopandroid:letterSpacing=".05" gibi bir programda
.05'in

Yanıtlar:


26

android'e göz atın: textScaleX

Ne kadar boşluğa ihtiyacınız olduğuna bağlı olarak, bu yardımcı olabilir. TextView'daki harf aralığı ile uzaktan ilgili tek şey budur.

Düzenleme: bakın JerabekJakub yanıtı @ güncellenmiş, daha iyi yöntem için aşağıda (Lolipop) API 21 ile başlayan bunu


9
Bunu harf aralığına nasıl çevirirsin?
Eric Novins

92
Harfler / karakterler arasındaki boşluğu artırmanın / azaltmanın bir yolu var mı? textScaleX - Edebi, harfleri / karakterleri ölçekler.
Kaymatrix

2
@Barts cevabı sorunun sorduğu şeyi yapıyor
bkurzius

2
Metni X ekseninde ölçeklemek, Android'de karakter aralığı veya izlemeyi ele almanın doğru yolu değildir. Lolipop için bunu gerçekleştiren bir api vardır, ancak lolipoptan önce bunu başarmak için özel bir metin görünümüne ihtiyacınız olacaktır.
Elliott

2
Bu çözümün nasıl bu kadar çok olumlu oy aldığını bilmiyorum (+33, -24) insanlar körü körüne mi oy veriyor? letterSpacingvs textScaleXne büyük bir fark
Jimit Patel

230

API 21'den beri bir seçenek seti harf aralığı vardır. SetLetterSpacing yöntemini çağırabilir veya letterSpacing niteliğiyle XML'de ayarlayabilirsiniz .


1
Bu, XML'de ayarlandığında aslında çalışmaz. Bunun gibi bir hata alıyorum:"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman

20
@dopatraman Birimleri belirtmelisiniz, sadece değeri yazın: android: letterSpacing = "1.2" yerine android: letterSpacing = "1.2dp"
JerabekJakub

12
Cihazların% 31'inin API 21'i desteklemediğini bilerek, bunu önceki sürümlerde nasıl yapardınız?
ninjaneer

25
LetterSpacing değerinin dp / sp cinsinden olmadığını, 'EM' birimlerinde olduğunu unutmayın. Hafif genişleme için tipik değerler 0,05 civarında olacaktır. Negatif değerler metni sıkılaştırır.
Cristan

25
Nedense letterSpacingAS önizlemesinde değişmiyordu. Değişikliği görmek için uygulamayı fiziksel bir cihazda çalıştırmam gerekiyordu.
Drew Szurko


26

Bu cevap Pedro'nun cevabına dayanmaktadır ancak ayarlanmıştır, böylece metin özelliği zaten ayarlanmışsa da işe yarar:

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

Programlı olarak kullanmak istiyorsanız:

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

bu aslında karakterler arasına boşluk eklendi mi? Boo ... birisi bu metni kopyalarsa fazladan boşluklar da içerecektir. No-Joy
johnw182

Bir nullcheck-in gerekiyor applyLetterSpacing, ama bunun dışında hayat kurtarıcı!
Bart van Nierop

metin sonralarını ayarladığınızda ve ardından programatik olarak boşluk uyguladığınızda çalışmıyor
Jonathan

@jonney olmalı, böyle çalışmasını sağladım. Bir örnek gönderebilir misin?
Bart Burg

1
Bölünmez boşluk - "\ u00A0" - gerçekten kullanışlıdır. Teşekkürler
Shayan_Aryan

11

API> = 21'den sonra TextView tarafından çağrılan dahili yöntem var setLetterSpacing

daha fazlası için bunu kontrol et


3
<21'de nasıl aynı olabilir?
Rahul Devanavar

2
eğer (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)); }
Maulik Patel


0

Android böyle bir şeyi desteklemediğinden, bunu FontCreator ile manuel olarak yapabilirsiniz. Yazı tipi değiştirmek için iyi seçeneklere sahiptir. Bu aracı, birkaç kez sürse bile, özel bir yazı tipi oluşturmak için kullandım, ancak projelerinizde her zaman kullanabilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.