【Android】文本自定义换行checkWordWrap,换行右边对齐,中英混合右边出现空白的优化

【目的】:为了解决 Textview 默认换行,含中英混合时换行空白太多问题;

先固定一行显示多少字符,然后遍历文本,判断一行末尾的位置,手动添加换行符。中间判断一行实际的字符数,需要区分中英文,然后统计;

    /**
     * 判断一个字符是否是中文
      */
    public static  boolean isChinese2(char c) {
        return c >= 0x4E00 && c <= 0x9FD5;// 根据字节码判断
    }

    /**
     * 判断一个字符是否是日文
      */
    public static  boolean isJapanese(char c) {
        return c >= 0x3040 && c <= 0x31FF;// 根据字节码判断
    }

    /**
     * 判断一个字符是否是韩文
      */
    public static  boolean isKorean(char c) {
        return c >= 0xAC00 && c <= 0xD7AF;// 根据字节码判断
    }


    /**
     * 判断是否是 中日韩 文
      */
    public static  boolean isCJK(char c) {
        return isChinese2(c) || isJapanese(c) || isKorean(c);// 根据字节码判断
    }


    /**
     * 检查文本自动换行(右边文字对齐,避免出现右边大的空白)(兼容已经含换行符的文本)
     * @param oneLineLength 规定一行字数 (按英文字符统计)(设置要少于或等于【最大显示数 - 4】,因为必须要低于系统自动换行的宽度)
     */
    public static SpannableStringBuilder checkWordWrap(SpannableStringBuilder spannable, int oneLineLength){

        SpannableStringBuilder result = new SpannableStringBuilder();
        int tempOneCount = 0;//记录一行的英文字符数 (汉字占2个)
        for (int i = 0; i < spannable.length(); i++) {
            char c = spannable.charAt(i);
            int itemLength = 1;//字符长度
            //判断中日韩文,占两个长度
            if (isCJK(c)){
                itemLength = 2;
            }

            tempOneCount+= itemLength;

            if (tempOneCount >= oneLineLength){//实际长度 >= 规定长度 ,加换行符
                result.append(c);
                if (c !='\n' && i < spannable.length() -1){//非最后一个(且非换行),才加换行
                    result.append("\n");
                }
                tempOneCount = 0;

//            } else if(tempOneCount > oneLineLength){//实际长度 > 规定长度 ,在这个字符前先加换行符
//                result.append("\n");
//                result.append(c);
//                tempOneCount = itemLength;

            } else {
                result.append(c);
                if(c == '\n'){//如果是换行符,计数清空
                    tempOneCount = 0;
                }
            }

        }
        return result;

    }


    /**
     * 获取-英文字符长度
     */
    public static int getEnglishLength(String text){
        int length = 0;//记录一行的英文字符数 (汉字占2个)
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            //判断中日韩文,占两个长度
            if (isCJK(c)) {
                length += 2;
            } else {
                length++;
            }
        }
        return length;
    }

    /**
     * 文本中,包含‘中日韩’字符的个数
     */
    public static int getContainCJKCount(String text){
        int count = 0;
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            //判断'中日韩'字符
            if (isCJK(c)) {
                count++;
            }
        }
        return count;
    }


使用方法:

SpannableStringBuilder spannable = new SpannableStringBuilder();
            spannable.append("[看看看看3232kkkfdasfsa] fdasfdsa3fdsafdsa范德否达3234324322432432432432范德萨范德萨432432432432");

            //检查换行,右边文本对齐
            spannable = StringTextUtils.checkWordWrap(spannable,28);
            tv.setText(spannable);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值