【问题标题】:How make spacing between letters in Android TextView?如何在 Android TextView 中设置字母之间的间距?
【发布时间】:2015-04-16 04:40:35
【问题描述】:

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

answer on stackoverflow

answer two

但如果我让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);
        }
    }
}

【问题讨论】:

  • “如果我适应一个设计”你能告诉我们你这样做的代码吗?
  • 代码号我会调整大小,直到它们与 Photoshop 一致。
  • 您是否尝试创建自定义textView? (myTextView extends TextView) 如果是这样,有什么问题?
  • 是的,但您没有提供代码或错误说明!感谢您的代码。
  • @ip696 你也可以查看这个答案集stackoverflow.com/questions/1640659/…

标签: android textview


【解决方案1】:

尝试使用新的 TextView API 方法setLetterSpacingSee here

编辑

你也可以create your own font在字体本身和apply it to your TextView之间添加空格。

【讨论】:

  • 没有任何 setLetterSpanning 方法
  • 你的回答和我一模一样,还说我的回答不正确?
  • 据我所知,这仅适用于android 21
  • 检查单词你会发现不同。我确实先在评论上发布了我的答案,您可以查看时间日志
  • 糟糕。谢谢,错字。
【解决方案2】:

从 API 21 开始你可以使用

setLetterSpacing

文档可以在here找到

【讨论】:

  • 据我所知,这仅适用于android 21
  • @ip696 是的,这仅适用于 API 21
  • 它应该可以工作。我现在在 API 21 上的程序上使用相同的编码
  • 距离增加不成比例
  • 只是因为我花了一点时间才弄明白,0代表没有字母间距,所以稍微的间距是0.2(不是1.2)
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 2015-10-30
  • 2020-02-20
  • 1970-01-01
  • 2013-07-22
  • 2020-12-04
相关资源
最近更新 更多