1. 程式人生 > 實用技巧 >canvas measureText( ) 替代方法

canvas measureText( ) 替代方法

canvas.measureText( text ).width 可以獲取text的寬度,實現canvas裡文字換行。

      drawText: function(t, x, y, w) {
                var c = document.getElementById("canvas");
                var context = c.getContext("2d");
                var chr = t.split("");
                var temp = "";
                var row = [];

                context.font 
= "20px Arial"; context.fillStyle = "black"; context.textBaseline = "middle"; for (var a = 0; a < chr.length; a++) { if (context.measureText(temp).width < w) {; } else { row.push(temp); temp
= ""; } temp += chr[a]; } row.push(temp); for (var b = 0; b < row.length; b++) { context.fillText(row[b], x, y + (b + 1) * 20); } }

但是measureText在真機除錯裡異常緩慢

所以找了個替代measureText的方法。

getTrueLength(str){//獲取字串的真實長度(位元組長度)
    var len = str.length, truelen = 0;
        for(var x = 0; x < len; x++){
        if(str.charCodeAt(x) > 128){
            truelen += 2;
        }else{
            truelen += 1;
        }
        }
        return truelen;
},                
cutString(str, leng){//按位元組長度擷取字串,返回substr擷取位置
    var len = str.length, tlen = len, nlen = 0;
    for(var x = 0; x < len; x++){
        if(str.charCodeAt(x) > 128){
            if(nlen + 2 < leng){
                nlen += 2;
            }else{
                tlen = x;
                break;
            }
        }else{
            if(nlen + 1 < leng){
                nlen += 1;
            }else{
                tlen = x;
                break;
            }
        }
    }
            return tlen;
},
drawText(ctx_2d, size,  text ,startleft, starttop,bytelength,lineheight,color){
    //canvas物件,字型大小,內容,x,y,每行長度,行高,顏色
    ctx_2d.setFontSize(size)
    if(color){
        ctx_2d.setFillStyle(color) 
    }else{
        ctx_2d.setFillStyle("#333333") 
    }
    for(var i = 1; this.getTrueLength(text) > 0; i++){
        var tl = this.cutString(text, bytelength);
        ctx_2d.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), startleft, (i-1) * lineheight + starttop);
        text = text.substr(tl);
    }
},