Làm cách nào để thay đổi khoảng cách chữ trong Textview?


127

Làm thế nào tôi có thể thay đổi khoảng cách chữ trong một văn bản? Nó có giúp ích gì không nếu tôi có văn bản HTML trong đó (Tôi không thể sử dụng webview trong mã của mình).

PS Tôi đang sử dụng kiểu chữ của riêng tôi trong chế độ xem văn bản với văn bản HTML.


5
Trong trình chỉnh sửa bố cục, bạn có thể thực hiện android:letterSpacing=".05"Trường hợp 0,05 sẽ là "50" trong một chương trình như photoshop
Jacksonkr

Câu trả lời:


26

kiểm tra android: textScaleX

Tùy thuộc vào khoảng cách bạn cần, điều này có thể giúp ích. Đó là điều duy nhất từ ​​xa liên quan đến khoảng cách chữ trong TextView.

Chỉnh sửa: vui lòng xem phản hồi của @ JerabekJakub bên dưới để biết phương pháp cập nhật, tốt hơn để bắt đầu với api 21 (Lollipop)


9
Làm thế nào bạn sẽ dịch nó qua khoảng cách chữ?
Eric Novins

92
Có cách nào để tăng / giảm khoảng cách giữa các chữ cái / ký tự không? textScaleX - Văn học chia tỷ lệ các chữ cái / ký tự.
Kaymatrix

2
@Barts trả lời những gì câu hỏi đang hỏi
bkurzius

2
Thu nhỏ văn bản theo trục X không phải là cách thích hợp để xử lý sự khôn ngoan hoặc theo dõi trong Android. Có một api cho kẹo mút thực hiện điều này tuy nhiên trước đây đối với kẹo mút, bạn sẽ cần một chế độ xem văn bản tùy chỉnh để thực hiện điều này.
Elliott

2
Tôi không biết làm thế nào giải pháp này có quá nhiều lượt ủng hộ (+33, -24) là mọi người chỉ mù quáng bỏ phiếu? letterSpacingso với textScaleXsự khác biệt quá lớn
Jimit Patel 7/03/2017

230

Vì API 21 có một tùy chọn đặt khoảng cách chữ. Bạn có thể gọi phương thức setLetterSpaces hoặc đặt nó trong XML với thuộc tính letterSpaces .


1
Điều này không thực sự hoạt động khi được đặt trong XML. Tôi gặp một lỗi như thế này:"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman

20
@dopatraman Bạn phải nhập đơn vị, nhập giá trị: android: letterSpaces = "1.2" thay vì android: letterSpaces = "1.2dp"
JerabekJakub

12
Biết rằng 31% thiết bị không hỗ trợ API 21, bạn sẽ làm điều này như thế nào trong các phiên bản trước?
ninjaneer

25
Lưu ý rằng giá trị của letterSpaces không tính bằng dp / sp, nó được tính theo đơn vị 'EM'. Các giá trị tiêu biểu cho sự mở rộng nhẹ sẽ vào khoảng 0,05. Giá trị tiêu cực thắt chặt văn bản.
Cristan

25
Vì một số lý do letterSpacingđã không thay đổi trong bản xem trước AS. Tôi đã phải thực sự chạy ứng dụng trên một thiết bị vật lý để thấy sự thay đổi.
Drew Szurko


26

Câu trả lời này dựa trên câu trả lời của Pedro nhưng được điều chỉnh để nó cũng hoạt động nếu thuộc tính văn bản đã được đặt:

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

Nếu bạn muốn sử dụng nó theo chương trình:

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

Đây có phải là không gian thực sự giữa các nhân vật? Boo ... nếu ai đó sao chép văn bản này, nó sẽ bao gồm các khoảng trắng thừa. No-Joy
johnw182

Cần nullkiểm tra applyLetterSpacing, nhưng ngoài ra, cứu người!
Bart van Nierop 3/2/2015

không hoạt động khi bạn đặt mật khẩu văn bản và sau đó áp dụng khoảng cách theo chương trình
Jonathan

@jonney nó nên, tôi có nó làm việc như vậy. Bạn có thể gửi một ví dụ?
Bart Burg

1
Không gian nghỉ - "\ u00A0" - thực sự hữu ích. Cảm ơn
Shayan_Aryan

11

sau API> = 21, có phương thức inbuild được cung cấp bởi TextView được gọi là setLetterSpacing

kiểm tra cái này để biết thêm


3
Làm thế nào có thể giống nhau trong <21?
Rahul Devanavar

2
if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP) {this.setLetterSpaces (getResource (). getDimension (R.dimen.letter_spaces)); } other {this.setTextScaleX (getResource (). getDimension (R.dimen.letter_spaces)); }
Maulik Patel

10

Tôi đã xây dựng một lớp tùy chỉnh mở rộng TextViewvà giải quyết vấn đề này ... Kiểm tra câu trả lời của tôi ở đây =)


\\ cảm ơn rất nhiều vì đã tiết kiệm thời gian của tôi ^ _ ^
Muhamed El-Banna

0

Vì Android không hỗ trợ điều đó, bạn có thể thực hiện thủ công với FontCreator. Nó có các tùy chọn tốt để sửa đổi phông chữ. Tôi đã sử dụng công cụ này để xây dựng một phông chữ tùy chỉnh, ngay cả khi phải mất một vài lần nhưng bạn luôn có thể sử dụng nó trong các dự án của mình.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.