wkiwi的博客

小程序canvas小技巧

发布时间:5年前热度: 1154 ℃评论数:

1.绘制圆形头像

ctx.beginPath();
ctx.arc(80, 550, 40, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage(_this.AvatarTempFilePath, 40,510, 80, 80);
ctx.restore();
ctx.save();

2.文本截取不换行...


/**
			 * 文本截取不换行...
			 * @param {Object} ctx
			 * @param {String} text
			 * @param {Number} fontSize
			 * @param {Number} maxWidth
			 * @return {String} newStr
			 */
			cutText:function(ctx,text,fontSize,maxWidth){
				ctx.setFontSize(fontSize)
				let arrText = text.split('');
				let line = '';
				if(ctx.measureText(text).width <= maxWidth){
					return text;
				}
				for (let i = 0; i < arrText.length; i++) {
					line += arrText[i];
					let metrics = ctx.measureText(line);
					let width = metrics.width;
					if(width>=maxWidth){
						return line +'...';
					}
				}
			},

3.获取文本折行兼容/n换行

/**
			 * 获取文本折行兼容/n换行
			 * @param {Object} ctx
			 * @param {String} text
			 * @param {Number} fontSize
			 * @param {Number} maxWidth
			 * @return {Array} arrTr
			 */
			getTextLine: function(ctx,text,fontSize,maxWidth){
					ctx.setFontSize(fontSize)
			    let arrText = text.split('');
			    let line = '';
			    let arrTr = [];
					if((ctx.measureText(text).width <= maxWidth)&&(text.indexOf('/n')==-1)){
						arrTr.push(text)
						return arrTr;
					}
			    for (let i = 0; i < arrText.length; i++) {
						line += arrText[i];
						let metrics = this.ctx.measureText(line);
						let width = metrics.width;
						
						if((width>=maxWidth && i>0) || (i == arrText.length - 1) ){
							arrTr.push(line);
							line = ''
						}
						if(arrText[i]=='/'&&arrText[i+1]=='n'){
							i+=1
							line =line.substr(0,line.length-1)
							arrTr.push(line);
							arrTr.push('');//换行
							line = ''
						}
						
			    }
			    return arrTr;
			},

4.绘制圆角矩形

/**
			 * 绘制圆角矩形
			 * @param {Object} ctx
			 * @param {String} x
			 * @param {Number} y
			 * @param {Number} w
			 * @return {Array} h
			 * @return {Array} r
			 */
			roundRect: function(ctx, x, y, w, h, r) {
			  // 开始绘制
			  ctx.beginPath()
			  // 因为边缘描边存在锯齿,最好指定使用 transparent 填充
			  // 这里是使用 fill 还是 stroke都可以,二选一即可
			  ctx.setFillStyle('transparent')
			  // ctx.setStrokeStyle('transparent')
			  // 左上角
			  ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)
			
			  // border-top
			  ctx.moveTo(x + r, y)
			  ctx.lineTo(x + w - r, y)
			  ctx.lineTo(x + w, y + r)
			  // 右上角
			  ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)
			
			  // border-right
			  ctx.lineTo(x + w, y + h - r)
			  ctx.lineTo(x + w - r, y + h)
			  // 右下角
			  ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)
			
			  // border-bottom
			  ctx.lineTo(x + r, y + h)
			  ctx.lineTo(x, y + h - r)
			  // 左下角
			  ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)
			
			  // border-left
			  ctx.lineTo(x, y + r)
			  ctx.lineTo(x + r, y)
			
			  // 这里是使用 fill 还是 stroke都可以,二选一即可,但是需要与上面对应
				ctx.setFillStyle('#ffffff')
			  ctx.fill()
			  // ctx.stroke()
			  ctx.closePath()
			  // 剪切
			  ctx.clip()
				//退出
				ctx.restore()
			},

canvas,微信小程序

手机扫码访问