JAVA字符串根据宽度(像素)换行问题

前言

在一些场景下,我们经常会通过判断字符串的长度,比如个数来实现换行,但是中文、英文、数字、其实在展示的时候同样长度的字符串,其实它的宽度是不一样的,这也是们我通俗意义上说的宽度(像素)

1、根据字符串长度换行,中英文会出现问题

需求:

第一行21个字符,然后换行,第二行开始26个字符然后换行

WX20180808-163624@2x



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) ){ //第二行开始只显示3for(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);
}





如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,添加博主微信哦, 请下方留言吧。可与博主自由讨论哦

支付包 微信 微信公众号
支付宝 微信 微信公众号

猜你喜欢

转载自blog.csdn.net/u012954706/article/details/81511216
今日推荐