前言
在一些场景下,我们经常会通过判断字符串的长度,比如个数来实现换行,但是中文、英文、数字、其实在展示的时候同样长度的字符串,其实它的宽度是不一样的,这也是们我通俗意义上说的宽度(像素)
1、根据字符串长度换行,中英文会出现问题
需求:
第一行21个字符,然后换行,第二行开始26个字符然后换行
String tuijian = description ;
StringBuffer s1= null;
String oneLine = "",otherLine = "";
if(tuijian.length()>21){ //
oneLine = tuijian.substring(0,21);
//除了第一行剩下的其他字符串给到otherLine
otherLine = tuijian.substring(21,tuijian.length()); }else { //不够第一行直接输入就可以
oneLine = tuijian ;
}
if(!StringUtils.isBlank(otherLine)){
s1 = new StringBuffer(otherLine);
if(tuijian.length()>26) {
int n = tuijian.length() / 26; //看看有几行
for (int index = 26; index < tuijian.length(); index += 26, n--) {
if (n > 1) {
s1.insert(index, '\n');
}
}
} else { //不够26个则直接给到第二行即可
s1.append(otherLine);
}
}
String otherFinal = s1.toString();
List<String> strs = Arrays.asList(otherFinal.split("\n"));
if(!StringUtils.isBlank(oneLine)) {
fixTuiJian.drawString(oneLine, 85*30, 560*30);
}
if(!StringUtils.isBlank(otherFinal) ){ //第二行开始只显示3行
for(int m = 0 ;m <strs.size();m++){
if(m ==0){
fixTuiJian.drawString(strs.get(m), 20*30, 580*30);
}else if(m ==1){
fixTuiJian.drawString(strs.get(m), 20*30, 600*30);
}else if(m == 2){
fixTuiJian.drawString(strs.get(m), 20*30, 620*30);
}
}
}
2、根据像素宽度进行换行,解决中英文宽度不一致问题
BufferedImage lineSizeBufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
FontMetrics metricsLineSizeBufferedImage = lineSizeBufferedImage.createGraphics().getFontMetrics();
//总共字符串的像素,已经限制的宽度像素
int tuiJianStrLenth = metricsLineSizeBufferedImage.stringWidth(description.toString());// str要打印的字符串
int StrPixelOtherTuiJianWidth =0; //第一行之外的其他字符串的像素长度
int oneTuiJianWidth = 252 ; //第一行像素长度
int twoTuiJianWidth = 312; //第二行开始的像素长度
int tuiJiangLineSize = 1 ; //推荐语 行数,默认给1行
int charIndex = 0 ; //第一行换行处的 字符串index位置
StringBuilder finalStrOtherTuiJian = new StringBuilder();
StringBuilder sbOneTuiJian = new StringBuilder();// 存储每一行的字符串
if(oneTuiJianWidth< tuiJianStrLenth){
for (int i1 = 0; i1 < description.length(); i1++) {
char ch = description.charAt(i1);
sbOneTuiJian.append(ch);
//已经添加的字符串的长度通过 bounds2.getWidth() 获取
Rectangle2D bounds2 = metricsLineSizeBufferedImage.getStringBounds(sbOneTuiJian.toString(), null);
int tempStrPi1exlWi1dth = (int) bounds2.getWidth();
if (tempStrPi1exlWi1dth > oneTuiJianWidth) { //当已经添加的超过我们给出限制的宽度进行换行
charIndex = i1 ;
break;
}
}
}
if(charIndex!=0){
fixTuiJian.drawString(description.substring(0,charIndex), 85*30, 560*30);
//算出行数
int lineSize = (int) Math.ceil(StrPixelOtherTuiJianWidth * 1.0 / twoTuiJianWidth);// 算出行数
if (twoTuiJianWidth < StrPixelOtherTuiJianWidth) { // 页面宽度(width)小于 字符串长度
StringBuilder sb = new StringBuilder();// 存储每一行的字符串
int j = 0;
int tempStart = 0;
String tempStrs[] = new String[lineSize];// 存储换行之后每一行的字符串
for (int i1 = 0; i1 < finalStrOtherTuiJian.length(); i1++) {
char ch = finalStrOtherTuiJian.charAt(i1);
sb.append(ch);
//已经添加的字符串的长度通过 bounds2.getWidth() 获取
Rectangle2D bounds2 = metricsLineSizeBufferedImage.getStringBounds(sb.toString(), null);
int tempStrPi1exlWi1dth = (int) bounds2.getWidth();
if (tempStrPi1exlWi1dth > twoTuiJianWidth) { //当已经添加的超过我们给出限制的宽度进行换行
tempStrs[j++] = finalStrOtherTuiJian.substring(tempStart, i1); //一开始是从0开始
tempStart = i1; //当第一行有了数据之后 会将i1给到临时开始位置 tempStart
sb.delete(0, sb.length()); // 对sb内容进行清空,给他赋予下一行开始的字符
sb.append(ch);
}
// 最后一行
if (i1 == finalStrOtherTuiJian.length() - 1) {
tempStrs[j] = finalStrOtherTuiJian.substring(tempStart);
}
}
for (int i = 0; i < tempStrs.length; i++) {
if(i ==0){
fixTuiJian.drawString(tempStrs[i], 20*30, 580*30);
}else if(i ==1){
fixTuiJian.drawString(tempStrs[i], 20*30, 600*30);
}else if(i == 2){
fixTuiJian.drawString(tempStrs[i], 20*30, 620*30);
}
}
} else {
fixTuiJian.drawString(finalStrOtherTuiJian.toString(), 20*30, 580*30);
}
}else {
fixTuiJian.drawString(description, 85*30, 560*30);
}
如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,添加博主微信哦, 请下方留言吧。可与博主自由讨论哦
支付包 | 微信 | 微信公众号 |
---|---|---|