参考博客,自己改了点,供需要的人使用
/**
* 设置字间距TextView
* 参考:https://blog.csdn.net/shanshan_1117/article/details/79564271
* Created by yangzteL on 2018/12/6 0006.
*/
public class WordSpaceTextView extends android.support.v7.widget.AppCompatTextView {
private float spacing = Spacing.NORMAL;
public WordSpaceTextView(Context context) {
super(context);
}
public WordSpaceTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs) {
if (attrs != null) {
//TypedArray是一个数组容器用于存放属性值
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.WordSpaceTextView);
spacing = ta.getDimensionPixelSize(R.styleable.WordSpaceTextView_space_size,0);
// spacing = DensityUtil.sp2px(getContext(),spacingSp);
if(spacing >0){
applySpacing();
}
//用完务必回收容器
ta.recycle();
}
}
public WordSpaceTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* setText不能重写 只有用String将就咯
*
* @param text
*/
public void setText(String text) {
super.setText(text);
applySpacing();
}
/**
* 获取字间距
*/
public float getSpacing() {
return this.spacing;
}
/**
* 设置间距
*/
public void setSpacing(float spacing) {
this.spacing = spacing;
applySpacing();
}
/**
* 扩大文字空间
*/
private void applySpacing() {
if (this == null || this.getText() == null) return;
CharSequence text = this.getText().toString();
//1.不间断空格\u00A0,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ;
//2.半角空格(英文符号)\u0020,代码中常用的;
//3.全角空格(中文符号)\u3000,中文文章中使用;
String span = "\u3000";//一个中文空格长度
float textSize = getTextSize();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
builder.append(text.charAt(i));
if (i + 1 < text.length()) {
//如果前后都是英文,则不添加空格,防止英文空格太大
if (isEnglish(text.charAt(i) + "") && isEnglish(text.charAt(i + 1) + "")) {
} else {
builder.append(span);//一个中文所占的长度
}
}
}
// 通过SpannableString类,去设置空格
SpannableString finalText = new SpannableString(builder.toString());
// 如果当前TextView内容长度大于1,则进行空格添加
if (builder.toString().length() > 1) {
for (int i = 1; i < builder.toString().length() - 1; i++) {
// ScaleXSpan 基于x轴缩放 将空格进行缩放
if(TextUtils.equals(builder.toString().substring(i,i+1),span)){
finalText.setSpan(new ScaleXSpan(spacing / textSize), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
super.setText(finalText, BufferType.SPANNABLE);
}
public class Spacing {
public final static float NORMAL = 0;
}
/**
* 判断是否是英语
*/
public static boolean isEnglish(String charaString) {
return charaString.matches("^[a-zA-Z]*");
}
}
- attr.xml
<resources>
<declare-styleable name="WordSpaceTextView">
<attr name="space_size" format="dimension|reference"/><!-- 字间距 -->
</declare-styleable>
</resources>