自定义TextView使上下文字两端对齐

这里写图片描述

最近项目开发中发现需要实现上面这种两端文字对齐的效果,看到的一瞬间我想到的是在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这个类,网上资料很多,大家自行百度或谷歌吧~

代码量固然重要,但是思想也是很重要的。希望能帮到需要解决这个问题的小伙伴~最后,附上大神的简书地址,以及另外一种感觉还不错的实现思路

大神的简书地址:http://www.jianshu.com/u/ba9375e7cfee

另一种实现思路:http://www.jianshu.com/p/d8f50509b1e9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值