最近项目开发中发现需要实现上面这种两端文字对齐的效果,看到的一瞬间我想到的是在xml里直接用空格来实现(其实是没有想到好办法~手动尴尬),但是立马又否决了这个想法,如果内容比较多,这种方法就显得比较麻烦,同时也担心手机适配的原因,当然我没有验证过,这里我就不多说了~
最后还是决定自定义TextView比较好,本人比较菜,只好谷歌了一把,这里把自己找到的一位大神的代码贴上来
/**
* 将给定的字符串给定的长度两端对齐
*
* @param str 待对齐字符串
* @param size 汉字个数,eg:size=5,则将str在5个汉字的长度里两端对齐
* @Return
*/
public static SpannableStringBuilder justifyString(String str, int size) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
if (TextUtils.isEmpty(str)) {
return spannableStringBuilder;
}
char[] chars = str.toCharArray();
if (chars.length >= size || chars.length == 1) {
return spannableStringBuilder.append(str);
}
int l = chars.length;
float scale = (float) (size - l) / (l - 1);
for (int i = 0; i < l; i++) {
spannableStringBuilder.append(chars[i]);
if (i != l - 1) {
SpannableString s = new SpannableString(" ");//全角空格
s.setSpan(new ScaleXSpan(scale), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableStringBuilder.append(s);
}
}
return spannableStringBuilder;
}
代码不多,也很好理解,不过由于只是一个方法,所以拿来改了一下,方便在xml里作为控件使用,下面是改了之后的代码
/**
* Class:AlignmentTextView
* Description: 自定义TextView使上下文字两端对齐
* Creator:benny
* Date:2017/3/9
*/
public class AlignmentTextView extends TextView {
private int mTextLength;//文字的长度
private SpannableStringBuilder mStringBuilder;
public AlignmentTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
private void init(Context context,AttributeSet attrs) {
mStringBuilder = new SpannableStringBuilder();
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlignTextView);
mTextLength = typedArray.getInteger(R.styleable.AlignTextView_align_text_length, 0);
String text = this.getText().toString();
if (TextUtils.isEmpty(text)) {
return;
}
char[] chars = text.toCharArray();
//如果等于设置的文字长度,则不进行处理
if (chars.length >= mTextLength || chars.length == 1) {
return;
}
int l = chars.length;
//计算不同文字长度之间的间隔,也就是一个缩放倍数
float scale = (float) (mTextLength - l) / (l - 1);
for (int i = 0; i < l; i++) {
mStringBuilder.append(chars[i]);
if (i != l - 1) {
SpannableString s = new SpannableString(" ");//全角空格
s.setSpan(new ScaleXSpan(scale), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mStringBuilder.append(s);
}
}
this.setText(mStringBuilder);
}
}
关于SpannableStringBuilder这个类,网上资料很多,大家自行百度或谷歌吧~
代码量固然重要,但是思想也是很重要的。希望能帮到需要解决这个问题的小伙伴~最后,附上大神的简书地址,以及另外一种感觉还不错的实现思路