如何在Android TextView中调整字母之间的间距?

12

我需要从Photoshop的布局中设计。布局上有一些字体。设计师给了我这些字体。但是在Photoshop的布局中,他使用了字母之间的间距。我如何在Android的textView中实现这一点?我找到了一个解决方案:

在stackoverflow上的答案

第二个答案

但是如果我创建myTextView extends TextView,它会出现错误。如果我适应一个设备,在具有更大显示屏的设备上,字母之间的间距增加不成比例。

编辑

public class MyTextView extends TextView {
    private float letterSpacing = 0.0f;
    private CharSequence originalText = "";
    private Typeface typeface;

    public MyTextView(Context context) {
        this(context, null);
        isInEditMode();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        isInEditMode();
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray attributesArray = getResources().obtainAttributes(attrs, R.styleable.MyTextView);
        letterSpacing = attributesArray.getDimension(R.styleable.MyTextView_letterSpacing, 0.0f);
        String fontName = attributesArray.getString(R.styleable.MyTextView_fontName);
        if(!this.isInEditMode()) {
            if (null == fontName) {
                typeface = Fonts.getBlockBertholdRegular(context);
            } else {
                typeface = Fonts.get(context, fontName);
            }
            super.setTypeface(typeface);
        }
        originalText = super.getText();
        applyLetterSpacing();
        this.invalidate();
    }

    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.toUpperCase());
            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);
        if(!this.isInEditMode()) {
            super.setTypeface(typeface);
        }
    }
}

“如果我适配一台设备,您能向我们展示您编写的代码吗?” - Docteur
你尝试过创建自定义的 textView 吗?(myTextView extends TextView) 如果是这样,有什么问题出现了吗? - Docteur
1
是的,但您没有提供代码或解释出了什么问题!感谢您提供的代码。 - Docteur
1
@ip696,您也可以查看此答案集https://dev59.com/z3I-5IYBdhLWcg3w3cc8#16429758。 - surhidamatya
将TextWatcher制作为http://stackoverflow.com/questions/32260083/letter-spacing-in-android-edittext/43995723#43995723中所述的Android EditText中的字母间距。 - koa73
显示剩余7条评论
2个回答

9

没有setLetterSpanning方法。 - surhidamatya
你的回答和我的完全一样,你怎么能说我的回答是错误的呢? - Docteur
据我所知,这仅在安卓21中可用。 - ip696
1
检查一下单词,你会发现差别。我先在评论中发布了我的答案,你可以看到时间记录。 - surhidamatya
1
哎呀,谢谢,打错字了。 - Docteur
显示剩余8条评论

5
自API 21以来,您可以使用
setLetterSpacing

文档可以在这里找到。


据我所知,这仅在Android 21中可用。 - ip696
@ip696 是的,这只有从API 21才可用。 - surhidamatya
应该可以工作。我现在正在我的程序上使用相同的编码,API 21。 - surhidamatya
距离的增加并不成比例。 - ip696
据我所知,这取决于设备,但我不确定。 - surhidamatya
1
只是因为我花了一点时间才明白,0代表没有字母间距,所以略微间隔应该是0.2(而不是1.2)。 - D. Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接