canvas单、多行文本通过配置参数循环写入

canvas单、多行文本通过配置参数循环写入

demo:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport" content="width=640, user-scalable=no">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
<meta name="apple-mobile-web-app-title" content="">
<title>canvas - writeText</title>
<style>
*{ margin:0px; padding:0px; box-sizing:border-box; -webkit-tap-highlight-color:rgba(0,0,0,0); cursor:pointer;}
html{ max-width:640px; margin:0 auto;}
body{ font-family:"PingFangSC-Regular","sans-serif","STHeitiSC-Light","微软雅黑","Microsoft YaHei"; font-size:24px; line-height:2em; color:#000;
    -webkit-user-select:none;
			user-select:none;
    -webkit-touch-callout:none;
			touch-callout:none;
}

html , body{ height:100%; position:relative;}

#mycanvas{ width:100%; height:100%; vertical-align:middle;}
</style>
</head>

<body>


<canvas id="mycanvas"></canvas>


<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
//多行文本写入设置
//ctx_2d		getContext("2d") 对象
//lineheight	段落文本行高
//bytelength	设置单字节文字一行内的数量
//text			写入画面的段落文本
//startleft		开始绘制文本的 x 坐标位置(相对于画布)
//starttop		开始绘制文本的 y 坐标位置(相对于画布)
//maxLine       显示的行数,超出则截取掉
function writeTextOnCanvas(ctx_2d, lineheight, bytelength, text ,startleft, starttop, maxLine){
	function 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;
	}
	function cutString(str, leng){
		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;
	}
	for(var i = 1; getTrueLength(text) > 0; i++){
		if(i > maxLine){
			break;
		}
		var tl = cutString(text, bytelength);
		//ctx_2d.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), startleft, (i-1) * lineheight + starttop);
		ctx_2d.fillText(text.substr(0, tl), startleft, (i-1) * lineheight + starttop);
		text = text.substr(tl);
	}
}


var mycanvas = document.getElementById("mycanvas");
mycanvas.width  = $('body').width();
mycanvas.height = $('body').height();
var ctx1 = mycanvas.getContext("2d");

//设置要写入canvas中文本信息(对齐方式、文本内容、字号、是否加粗【bold】、是否倾斜【italic】、颜色、x位置、y位置、是否多行文本、多行文本的行高、多行文本每行英文字符数【中文字符数*2 = 英文字符数】)
var writeTextData = {
	name:    {textBaseline:'top',textAlign:'right',text:'',font_size:26,bold_style:'bold',italic_style:'italic',color:'#2d78f4',x:616,y:250,moreline:false,moreline_height:'',moreline_text_len:''},
	dateText:{textBaseline:'top',textAlign:'right',text:'',font_size:26,bold_style:    '',italic_style:'italic',color:'#2d78f4',x:616,y:290,moreline:false,moreline_height:'',moreline_text_len:''},
	content: {textBaseline:'top',textAlign:'left' ,text:'',font_size:28,bold_style:'bold',italic_style:      '',color:'#2d78f4',x:24 ,y:110 ,moreline:true ,moreline_height:42,moreline_text_len:44},
};
//可动态再设置文本
writeTextData.name.text     = '—— 姓名';
writeTextData.dateText.text = new Date().toLocaleDateString();
writeTextData.content.text  = '  测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本';
writeTextData.content.text  = '  测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本';


//向canvas中写入文本
setText();
function setText(){
	for (key in writeTextData) {
		ctx1.textBaseline = writeTextData[key].textBaseline;
		ctx1.textAlign = writeTextData[key].textAlign;
		//多行的字
		if(writeTextData[key].moreline){
			//投影的字
			ctx1.fillStyle = '#000000';
			ctx1.font = writeTextData[key].bold_style + ' ' + writeTextData[key].italic_style + ' ' + writeTextData[key].font_size + 'px "PingFangSC-Regular","sans-serif","STHeitiSC-Light","微软雅黑","Microsoft YaHei"';
			writeTextOnCanvas(ctx1,writeTextData[key].moreline_height,writeTextData[key].moreline_text_len,writeTextData[key].text, writeTextData[key].x + 2, writeTextData[key].y + 2, 3);
			//正常的字
			ctx1.fillStyle = writeTextData[key].color;
			ctx1.font = writeTextData[key].bold_style + ' ' + writeTextData[key].italic_style + ' ' + writeTextData[key].font_size + 'px "PingFangSC-Regular","sans-serif","STHeitiSC-Light","微软雅黑","Microsoft YaHei"';
			writeTextOnCanvas(ctx1,writeTextData[key].moreline_height,writeTextData[key].moreline_text_len,writeTextData[key].text, writeTextData[key].x , writeTextData[key].y, 3);
		//单行的字
		}else{
			//投影的字
			ctx1.fillStyle = '#000000';
			ctx1.font = writeTextData[key].bold_style + ' ' + writeTextData[key].italic_style + ' ' + writeTextData[key].font_size + 'px "font1","PingFangSC-Regular","sans-serif","STHeitiSC-Light","微软雅黑","Microsoft YaHei"';
			ctx1.fillText(writeTextData[key].text, writeTextData[key].x + 2, writeTextData[key].y + 2);
			//正常的字
			ctx1.fillStyle = writeTextData[key].color;
			ctx1.font = writeTextData[key].bold_style + ' ' + writeTextData[key].italic_style + ' ' + writeTextData[key].font_size + 'px "font1","PingFangSC-Regular","sans-serif","STHeitiSC-Light","微软雅黑","Microsoft YaHei"';
			ctx1.fillText(writeTextData[key].text, writeTextData[key].x , writeTextData[key].y);
		}
	}
}
</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_16494241/article/details/83178147