【目的】:为了解决 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);