Change text kerning or spacing in TextView?

前端 未结 3 1164
醉酒成梦
醉酒成梦 2021-01-13 14:39

I have a requirement where the letters in a TextView need to be spaced a little farther apart. Unfortunately, most of the resources I find seem to say this cannot be done--a

相关标签:
3条回答
  • 2021-01-13 15:04

    As of API 21, you can use setLetterSpacing() fot TextView (and Paint) objects.

    0 讨论(0)
  • 2021-01-13 15:05

    The solution I found is to mix the solutions 1 and 2 that you described. Adding spaces between letters and than changing the TextScaleX only of the spaces, so you keep other characters the same. I built a custom class that extends TextView and allows you to define the letter spacing. Everything else is automatic =)

    I posted the class on this other answer

    Hope that helps ^^

    0 讨论(0)
  • 2021-01-13 15:08

    This answer is based on Pedro's answer but editted so it also works when text attribute is allready set:

    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() {
            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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题