จะเปลี่ยนระยะห่างของตัวอักษรใน Textview ได้อย่างไร?


127

ฉันจะเปลี่ยนระยะห่างของตัวอักษรในมุมมองข้อความได้อย่างไร จะช่วยได้ไหมถ้าฉันมีข้อความ HTML อยู่ (ฉันไม่สามารถใช้ webview ในโค้ดของฉันได้)

ปล. ฉันใช้แบบอักษรของตัวเองใน textview พร้อมข้อความ HTML


5
ในโปรแกรมแก้ไขเค้าโครงคุณสามารถทำได้android:letterSpacing=".05"โดยที่. 05 จะมีค่าประมาณ "50" ในโปรแกรมเช่นphotoshop
Jacksonkr

คำตอบ:


26

ตรวจสอบAndroid: textScaleX

ขึ้นอยู่กับระยะห่างที่คุณต้องการสิ่งนี้อาจช่วยได้ นั่นเป็นสิ่งเดียวที่เกี่ยวข้องกับระยะห่างระหว่างตัวอักษรใน TextView

แก้ไข: โปรดดูการตอบกลับของ @ JerabekJakubด้านล่างสำหรับวิธีการที่ปรับปรุงและดีกว่าในการดำเนินการนี้โดยเริ่มจาก api 21 (Lollipop)


9
คุณจะแปลมันเป็นระยะห่างของตัวอักษรได้อย่างไร?
Eric Novins

92
มีวิธีเพิ่ม / ลดช่องว่างระหว่างตัวอักษร / ตัวอักษรหรือไม่? textScaleX - วรรณกรรมปรับขนาดตัวอักษร / อักขระ
Kaymatrix

2
@Barts ตอบคำถามคืออะไร
bkurzius

2
การปรับขนาดข้อความในแกน X ไม่ใช่วิธีที่เหมาะสมในการจัดการกับปัญหาหรือการติดตามใน Android มี API สำหรับอมยิ้มที่ทำสิ่งนี้ได้ไม่ว่าจะเป็นอมยิ้มก่อนหน้านี้คุณจะต้องมีมุมมองข้อความที่กำหนดเองเพื่อทำสิ่งนี้ให้สำเร็จ
Elliott

2
ฉันไม่รู้ว่าโซลูชันนี้ได้รับคะแนนโหวตเพิ่มขึ้นมากมายขนาดไหน (+33, -24) ผู้คนแค่โหวตสุ่มสี่สุ่มห้า? letterSpacingเทียบกับtextScaleXความแตกต่างอย่างมาก
Jimit Patel

230

เนื่องจาก API 21 มีชุดตัวเลือกระยะห่างของตัวอักษร คุณสามารถเรียกวิธีsetLetterSpacingหรือตั้งไว้ใน XML ที่มีแอตทริบิวต์letterSpacing


1
สิ่งนี้ใช้ไม่ได้จริงเมื่อตั้งค่าใน XML ฉันได้รับข้อผิดพลาดดังนี้"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman

20
@dopatraman คุณต้อง ommit หน่วยพิมพ์เพียงค่า: android: letterSpacing = "1.2" แทน android: letterSpacing = "1.2dp"
JerabekJakub

12
เมื่อทราบว่าอุปกรณ์ 31% ไม่รองรับ API 21 คุณจะทำอย่างไรในเวอร์ชันก่อนหน้านี้
ninjaneer

25
โปรดทราบว่าค่าของ letterSpacing ไม่ได้อยู่ใน dp / sp แต่อยู่ในหน่วย "EM" ค่าทั่วไปสำหรับการขยายตัวเล็กน้อยจะอยู่ที่ประมาณ 0.05 ค่าลบกระชับข้อความ
Cristan

25
ด้วยเหตุผลบางประการletterSpacingไม่ได้เปลี่ยนแปลงในการแสดงตัวอย่าง AS ฉันต้องเรียกใช้แอปบนอุปกรณ์จริงเพื่อดูการเปลี่ยนแปลง
Drew Szurko

46

พื้นที่มากขึ้น:

  android:letterSpacing="0.1"

พื้นที่น้อย:

 android:letterSpacing="-0.07"

2
ตัวอักษรเริ่มต้นคืออะไร
Shivam

3
ค่าเริ่มต้นletterSpacingคือ 0.0 ตามที่developer.android.com/reference/android/widget/…
Evin1_

อาจจะเพิ่มความคิดเห็นของ @ Evin1_ ในคำตอบของคุณ
Sarthak Mittal

ตัวอักษรสูงสุดและต่ำสุดที่รองรับคืออะไร?
Jimit Patel

26

คำตอบนี้อ้างอิงจากคำตอบของ Pedro แต่ได้รับการปรับแต่งเพื่อให้ใช้ได้เช่นกันหากมีการตั้งค่าคุณสมบัติข้อความไว้แล้ว:

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

นี่เป็นการเพิ่มช่องว่างระหว่างอักขระจริงหรือ Boo ... ถ้ามีคนคัดลอกข้อความนี้จะรวมช่องว่างไว้ด้วย No-Joy
johnw182

ต้องการnullเช็คอินapplyLetterSpacingแต่นอกเหนือจากนั้นช่วยชีวิต!
Bart van Nierop

ใช้งานไม่ได้เมื่อคุณตั้งค่าคำหลังของข้อความแล้วใช้ระยะห่างแบบเป็นโปรแกรม
โจนาธาน

@jonney ควรให้มันทำงานแบบนั้น คุณช่วยส่งตัวอย่างได้ไหม
Bart Burg

1
พื้นที่ว่าง - "\ u00A0" - มีประโยชน์มาก ขอบคุณ
Shayan_Aryan

11

หลังจาก API> = 21 มีวิธีการสร้างโดย TextView ที่เรียกว่า setLetterSpacing

ตรวจสอบข้อมูลเพิ่มเติม


3
จะเหมือนกันใน <21 ได้อย่างไร?
Rahul Devanavar

2
ถ้า (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 ไม่รองรับสิ่งนั้นคุณสามารถทำได้ด้วยตนเองด้วย FontCreator มีตัวเลือกที่ดีสำหรับการแก้ไขแบบอักษร ฉันใช้เครื่องมือนี้เพื่อสร้างแบบอักษรที่กำหนดเองแม้ว่าจะใช้เวลาสักครู่ แต่คุณสามารถใช้ในโครงการของคุณได้ตลอดเวลา


-1

สำหรับการฝังข้อความ HTML ใน textview ของคุณคุณสามารถใช้Html.fromHTML()ไวยากรณ์ ข้อมูลเพิ่มเติมที่คุณจะได้รับจากhttp://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29


1
วิธีนี้ช่วยได้อย่างไร ฉันไม่ทราบแท็ก HTML สำหรับการเว้นระยะห่างของตัวอักษรที่ทำงานใน TextView
k2col
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.