canvans畫圖時,文字分行

dealWords: function (options) {
        options.ctx.setFontSize(options.fontSize);//設置字體大小
        options.ctx.setFillStyle(options.fillstyle);//設置字體大小
        var allRow = Math.ceil(options.ctx.measureText(options.word).width / options.maxWidth);//實際總共能分多少行
        var count = allRow >= options.maxLine ? options.maxLine : allRow;//實際能分多少行與設置的最大顯示行數比,誰小就用誰作循環次數
            
        var endPos = 0;//當前字符串的截斷點
        for (var j = 0; j < count; j++) {
            var nowStr = options.word.slice(endPos);//當前剩餘的字符串
            var rowWid = 0;//每一行當前寬度    
            if (options.ctx.measureText(nowStr).width > options.maxWidth) {//若是當前的字符串寬度大於最大寬度,而後開始截取
                for (var m = 0; m < nowStr.length; m++) {
                    rowWid += options.ctx.measureText(nowStr[m]).width;//當前字符串總寬度
                    if (rowWid > options.maxWidth) {                        
                        if (j === options.maxLine - 1) { //若是是最後一行
                            options.ctx.fillText(nowStr.slice(0, m - 1) + '...', options.x, options.y + (j + 1) * 18);    //(j+1)*18這是每一行的高度        
                        } else {
                            options.ctx.fillText(nowStr.slice(0, m), options.x, options.y + (j + 1) * 18);
                        }
                        endPos += m;//下次截斷點
                        break;
                    }
                }
            } else {//若是當前的字符串寬度小於最大寬度就直接輸出
                options.ctx.fillText(nowStr.slice(0), options.x, options.y + (j + 1) * 18);
            }
        }
    },

調用:字體

 this.dealWords({
         ctx: ctx,//畫布上下文
         fontSize: 18,//字體大小
         fillstyle:'#333333',
         word: text,//須要處理的文字
         maxWidth: 325,//一行文字最大寬度
         x: 10,//文字在x軸要顯示的位置
         y: 285,//文字在y軸要顯示的位置
         maxLine: 2//文字最多顯示的行數
     });
相關文章
相關標籤/搜索