uniapp使用canvas

本文介绍了一种在uniapp中使用双指触控缩放图片的方法。通过监听touchstart、touchmove和touchend事件,计算两个手指之间的距离和角度变化,从而调整canvas上图片的缩放比例和旋转角度。
  •  页面中加入组件
<canvas canvas-id="canvas" class="canvas" @touchstart="cas_start" @touchmove="cas_move" @touchend="cas_end"></canvas>
  •  onReady获取页面宽度,加入条件编译
onReady() {
			//#ifdef APP-PLUS
				this.canvasWidth = uni.getSystemInfoSync().windowWidth;
				this.cas_Drawer(this.canvasWidth,384,1);
			//#endif
		}
  •  methods对象中方法
cas_start(e){
				console.log('触摸开始');
				console.log(e)
				if(e.touches.length>1){//大于一的时候,可以判断是两个手指
					this.startArr=e.touches;
				}
			},
cas_move(e){
				console.log('触摸移动');
				console.log(e)
				if(e.touches.length>1){
					console.log(2);
					this.nowArr=e.touches;
					var scale=this.getDistance(this.nowArr[0],this.nowArr[1])/this.getDistance(this.startArr[0],this.startArr[1]); //得到缩放比例,
					if(scale!=1){
						this.cas_Drawer(this.canvasWidth,384,scale);
					}
					var rotation=this.getAngle(this.nowArr[0],this.nowArr[1])-this.getAngle(this.startArr[0],this.startArr[1]);  //得到旋转角度,
				}
			},
cas_end(e){
				console.log('触摸结束');
				console.log(e)
			},
getDistance(p1, p2) {
			    var x = p2.x - p1.x,
			        y = p2.y - p1.y;
			    return Math.sqrt((x * x) + (y * y));//getDistance是勾股定理的一个方法,用于计算放大倍数
			},
getAngle(p1, p2) {
			    var x = p1.x - p2.x,
			        y = p1.y - p2.y;
			    return Math.atan2(y, x) * 180 / Math.PI;//getAngle是得到夹角的一个方法用于计算放大倍数
			},
cas_Drawer(width,height,scale){
				console.log(scale);
				let ctx = uni.createCanvasContext('canvas');
				ctx.clearRect(0,0,width,height);//清除画布
				ctx.drawImage('../../static/img/bg.jpg',0,0,width*scale,height*scale);//绘制图片
				ctx.draw();//绘制图片
			}

当前canvas方法主要是用于两个手指缩放图片大小,还有很多地方要改,uniapp组件库里面有相应的组件可以更好的实现这个要求。

 

### 如何在 UniApp使用 Canvas 进行开发和绘图 #### 创建 Canvas 组件 为了能够在 UniApp 应用程序中利用 `Canvas` 功能,首先需要创建一个 `<canvas>` 组件并为其指定唯一的 ID 或者 canvas-id 属性以便后续操作该组件。 ```html <template> <view class="container"> <!-- 定义 canvas 组件 --> <canvas type="2d" id="myCanvas" canvas-id="myCanvas"></canvas> </view> </template> <script> export default { mounted() { const query = uni.createSelectorQuery().in(this); query.select('#myCanvas') .fields({ node: true, size: true }) .exec((res) => { let canvas = res[0].node; let ctx = canvas.getContext('2d'); // 开始在此处编写绘图逻辑... }); } } </script> ``` #### 使用 CanvasRenderingContext2D API 进行绘制 一旦获取到了上下文对象 (`ctx`) ,就可以通过调用各种方法来实现不同类型的图形渲染。例如: - **绘制矩形** 可以填充或者描边矩形形状 ```javascript ctx.fillStyle = 'blue'; // 设置颜色为蓝色 ctx.fillRect(10, 10, 150, 80); // 填充一个宽高分别为150px 和 80px 的矩形区域[^2] ctx.strokeStyle = 'red'; ctx.strokeRect(170, 10, 150, 80); // 描边另一个相同大小的位置不同的矩形 ``` - **绘制线条** 利用 moveTo(), lineTo() 方法定义路径,并最终 stroke() 来完成实际的绘画过程。 ```javascript ctx.beginPath(); ctx.moveTo(50, 50); ctx.lineTo(200, 50); ctx.lineWidth = 5; // 设定线宽 ctx.stroke(); // 执行绘制命令 ``` - **保存图像数据** 如果想要导出当前画布上的内容作为图片文件,则可以通过 toDataURL 函数获得 base64 编码后的字符串表示形式的数据 URL。 ```javascript var imgDataUrl = canvas.toDataURL("image/png"); console.log(imgDataUrl); ``` 上述代码片段展示了如何初始化以及基本的操作方式,在具体项目里可以根据需求调整参数值或增加更多复杂的功能特性[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值