canvas measureText( ) 替代方法
阿新 • • 發佈:2020-08-06
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); } },