android - 更改字母间距/字距调整 EditText

标签 android android-edittext kerning

我有一个 Costum 构建的 EditText 类,我想知道是否可以更改 EditText 的字距调整,我对此有疑问,因为它将是一个密码字段,所以它接缝我无法使用:

builder.append("\u00A0");

编辑:这是代码。

public class MyEditText extends EditText {
    private float mLetterSpacing = 0;
    private CharSequence mOriginalText = "";

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    public float getLetterSpacing() {
        return mLetterSpacing;
    }

    public void setLetterSpacing(float letterSpacing) {
        mLetterSpacing = letterSpacing;
        applyLetterSpacing();
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        mOriginalText = text;
        applyLetterSpacing();
    }

    public void applyLetterSpacing() {
        StringBuilder builder = new StringBuilder();
        for(int i = 0; i < mOriginalText.length(); i++) {
            String c = ""+ mOriginalText.charAt(i);
            builder.append(c.toLowerCase());
            if(i+1 < mOriginalText.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((mLetterSpacing+1)/10), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        super.setText(finalText, BufferType.SPANNABLE);
    }

    public static Spannable applyKerning(CharSequence src, float kerning) {
        if (src == null) return null;
        final int srcLength = src.length();
        if (srcLength < 2) return src instanceof Spannable
                ? (Spannable)src
                : new SpannableString(src);

        final String nonBreakingSpace = "\u00A0";
        final SpannableStringBuilder builder = src instanceof SpannableStringBuilder
                ? (SpannableStringBuilder)src
                : new SpannableStringBuilder(src);
        for (int i = src.length() - 1; i >= 1; i--)
        {
            builder.insert(i, nonBreakingSpace);
            builder.setSpan(new ScaleXSpan(kerning), i, i + 1,
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        return builder;
    }

}

我试过了,但没有成功。我想知道是否可以在不弄乱“密码字符串”的情况下添加间距。

最佳答案

我认为最好的(唯一的?)方法是使用具有您想要的字距调整的字体,并将其设置在 EditText 上。看起来没有办法以编程方式更改字距调整。

关于android - 更改字母间距/字距调整 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25141287/

相关文章:

java - RxJava : Find out if BehaviorSubject was a repeated value or not

android - 如何在 editText 处于焦点时隐藏键盘

android - 在编辑文本中获取 Android 中的光标位置?

pdf - PDF 文件中嵌入的 Adob​​e Type 1 字体的字距是如何编码的?

ios - 为什么 iOS 等宽字体的行为不是那样的?

android - 可变屏幕分辨率 Sprite 不缩放统一

android - java.lang.RuntimeException : An error occured while executing doInBackground() 错误

android - OSMDroid:onTap 示例

android - 如何允许粘贴到空的 EditText 中?

css - 收紧特定对的字距调整?