टेक्स्टव्यू में लेटर स्पेसिंग कैसे बदलें?


127

मैं एक टेक्स्टव्यू में पत्र रिक्ति कैसे बदल सकता हूं? यदि इसमें HTML पाठ है तो मैं इसकी मदद करूंगा (मैं अपने कोड में वेबव्यू का उपयोग नहीं कर सकता)।

PS मैं अपने स्वयं के टाइपफेस को HTML टेक्स्ट के साथ टेक्स्टव्यू में उपयोग कर रहा हूं।


5
लेआउट एडिटर में आप फोटोशॉपandroid:letterSpacing=".05" जैसे प्रोग्राम में जहां .05 मोटे तौर पर "50" होगा
जैक्सनक्रे

जवाबों:


26

बाहर की जाँच एंड्रॉयड: textScaleX

इस बात पर निर्भर करता है कि आपको कितनी जगह चाहिए, इससे मदद मिल सकती है। टेक्स्टव्यू में अक्षर-रिक्ति से संबंधित केवल यही एक चीज़ है।

संपादित करें: कृपया एक अद्यतन, बेहतर विधि के लिए नीचे दिए गए @ जराबेकजैकब की प्रतिक्रिया को २१ से शुरू करने के लिए देखें (लॉलीपॉप)


9
आप उस अक्षर को कैसे अनुवाद करेंगे?
एरिक नोविंस

92
क्या अक्षरों / वर्णों के बीच की जगह को बढ़ाने / घटाने का कोई तरीका है? textScaleX - साहित्य अक्षरों / वर्णों को मापता है।
Kaymatrix

2
@ बर्ट्स का जवाब वही करता है जो सवाल पूछ रहा है
bkurzius

2
एंड्रॉइड में कर्निंग या ट्रैकिंग को संभालने के लिए एक्स अक्ष में पाठ को स्केल करना उचित तरीका नहीं है। लॉलीपॉप के लिए एक एपीआई है जो इसे पूरा करता है लेकिन लॉलीपॉप से ​​पहले यह पूरा करने के लिए आपको एक कस्टम टेक्स्ट व्यू की आवश्यकता होगी।
इलियट

2
मुझे नहीं पता कि इस समाधान को इतने सारे अपवोट्स (+33, -24) कैसे मिले, क्या लोग आँख बंद करके अपना वोट डाल रहे हैं? letterSpacingबनाम textScaleXक्या बहुत बड़ा अंतर है
जिमित पटेल

230

एपीआई 21 के बाद से एक विकल्प सेट पत्र रिक्ति है। आप विधि कॉल कर सकते हैं setLetterSpacing या XML में सेट विशेषता के साथ letterSpacing


1
यह वास्तव में XML में सेट होने पर काम नहीं करता है। मुझे इस तरह की एक त्रुटि मिलती है:"1.2dp" in attribute "letterSpacing" cannot be converted to float."
डोपाट्रमं

20
@dopatraman आपको इकाइयों को ommit करना है, बस मान टाइप करें: android: letterSpacing = "1.2" एंड्रॉइड के बजाय: letterSpacing = "1.2dp"
JerabekJakub

12
यह जानकर कि 31% डिवाइस API 21 का समर्थन नहीं करते हैं, आप पिछले संस्करणों में यह कैसे करेंगे?
निंजानेर

25
ध्यान दें कि लेटरस्प्रेसिंग का मान dp / sp में नहीं है, यह 'EM' यूनिट्स में है। मामूली विस्तार के लिए विशिष्ट मान लगभग 0.05 होगा। नकारात्मक मान पाठ को कसते हैं।
क्रिस्टन

25
किसी कारण letterSpacingसे एएस पूर्वावलोकन में नहीं बदल रहा था। मुझे वास्तव में परिवर्तन को देखने के लिए एक भौतिक डिवाइस पर ऐप चलाना था।
ड्रू स्जुरको

46

ज्यादा जगह:

  android:letterSpacing="0.1"

कम जगह:

 android:letterSpacing="-0.07"

2
डिफ़ॉल्ट अक्षरस्पर्श क्या है?
शिवम

3
डिफ़ॉल्ट letterSpacing0.0 के अनुसार है developer.android.com/reference/android/widget/...
Evin1_

शायद उर उत्तर में @ Evin1_ की टिप्पणी जोड़ें
सार्थक मित्तल

अधिकतम और न्यूनतम अक्षरस्पर्शी समर्थन क्या है?
जिमित पटेल

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, लेकिन इसके अलावा, जीवन बचाने वाला!
बार्ट वैन नीरोप

जब यू टेक्स्ट टेक्स्ट को सेट नहीं करता है तब काम करता है और फिर प्रोग्रामिंग स्पेसिंग लागू करता है
जोनाथन

@ जोंनी को यह करना चाहिए, मेरे पास यह उसी तरह काम कर रहा है। क्या आप एक उदाहरण भेज सकते हैं?
बार्टन बर्ग

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)); } और {this.setTextScaleX (getResources ()। getDimension (R.dimen.letter_spacing)); }
मौलिक पटेल


0

जैसे कि एंड्रॉइड ऐसी चीज का समर्थन नहीं करता है, आप इसे FontCreator के साथ मैन्युअल रूप से कर सकते हैं। इसमें फॉन्ट मॉडिफिकेशन के अच्छे ऑप्शन हैं। मैंने इस टूल का उपयोग कस्टम फ़ॉन्ट बनाने के लिए किया था, भले ही इसमें कुछ समय लगे लेकिन आप इसे हमेशा अपनी परियोजनाओं में उपयोग कर सकते हैं।


-1

अपने टेक्स्टव्यू में HTML टेक्स्ट को एम्बेड करने के लिए आप Html.fromHTML()सिंटैक्स का उपयोग कर सकते हैं । अधिक जानकारी आपको http://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29 से प्राप्त होगी


1
यह कैसे मदद करता है? मुझे लेटर रिक्ति के लिए एक HTML टैग की जानकारी नहीं है जो TextView में काम करता है।
k2col
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.