<template> <view> <!-- 定义canvas画布 // 设置canvas大小为200x200像素 --> <!-- // @touchstart="handleCanvasTouch" --> <canvas @touchstart="handleTouchStart" @touchmove="handleTouchMove" @touchend="handleTouchEnd" :style="{ width: 1000 + 'px', height: 800 + 'px', transform: `translate(${offsetX}px, ${offsetY}px) scale(${scale})` }" canvas-id="canvas" id="canvas" ></canvas> <!-- style="border: 1px solid red;height: 600px;width: 100vw;" --> <image src="https://assets.sx25.troyrc.com/sx25/images/events/XBDT.jpg"></image> <!-- 添加一个按钮,用于触发绘图 --> <button @click="handleDraw">点击绘制圆形</button> </view> </template> <script setup> import { ref, onMounted, getCurrentInstance } from 'vue' import { onReady } from '@dcloudio/uni-app' const canvasWidth = ref(375) // 动态设置Canvas宽度 const canvasHeight = ref(400) // 动态设置Canvas高度 const instance = getCurrentInstance() const scale = ref(1) const offsetX = ref(0) const offsetY = ref(0) const lastDistance = ref(-1) const startX = ref(0) const startY = ref(0) const isDragging = ref(false) const imgUrl = ref('https://assets.sx25.troyrc.com/sx25/images/events/XBDT.jpg'); // 修改为ref async function draw() { const ctx = uni.createCanvasContext('canvas', instance) // 创建canvas绘图上下文 ctx.scale(scale.value, scale.value); const res = await uni.getImageInfo({ src: imgUrl.value, }) ctx.drawImage(res.path, 0, 0); // ctx.beginPath(); // ctx.moveTo(50, 50); // 左下角点 // ctx.lineTo(150, 50); // 右下角点 // ctx.lineTo(200, 100); // 右上角点 // ctx.lineTo(100, 100); // 左上角点 // ctx.closePath(); // 闭合路径 // ctx.stroke(); // 绘制边框 // 先不删 // let xoffset = 0, yoffset = 0, flag = false; // polygonList.forEach((level, index) => { // // console.log('level',level) // ctx.moveTo(level.polygon[0] + xoffset, level.polygon[0] + yoffset) // level.polygon.forEach((level2,level2Index)=>{ // ctx.beginPath() // if(level2Index != level.polygon.length ){ // ctx.lineTo(level2 + xoffset, level.polygon[level2Index+1]) // console.log(level2 + xoffset, level.polygon[level2Index+1]) // }else{ // ctx.lineTo(level2 + xoffset, level.polygon[0]) // console.log(level2 + xoffset, level.polygon[0]) // } // ctx.closePath() // }) // if(polygonList.length == index){ // flag = true // } // }) ctx.draw() } // 处理canvas触摸事件 function handleCanvasTouch(event) { // 获取触摸点的坐标 const x = event.touches[0].x; const y = event.touches[0].y; console.log(x,y,'12'); } // 触摸开始 const handleTouchStart = (e) => { console.log('handleTouchStart') if (e.touches.length === 1) { // 单指拖动 startX.value = e.touches[0].clientX - offsetX.value startY.value = e.touches[0].clientY - offsetY.value isDragging.value = true } else if (e.touches.length === 2) { // 双指缩放 const x1 = e.touches[0].clientX const y1 = e.touches[0].clientY const x2 = e.touches[1].clientX const y2 = e.touches[1].clientY lastDistance.value = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) } } // 触摸移动 const handleTouchMove = (e) => { console.log('handleTouchMove') if (e.touches.length === 1 && isDragging.value) { // 单指移动 const currentX = e.touches[0].clientX - startX.value const currentY = e.touches[0].clientY - startY.value offsetX.value = currentX offsetY.value = currentY } else if (e.touches.length === 2) { // 双指缩放 const x1 = e.touches[0].clientX const y1 = e.touches[0].clientY const x2 = e.touches[1].clientX const y2 = e.touches[1].clientY const distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) if (lastDistance.value > 0) { const newScale = scale.value * (distance / lastDistance.value) scale.value = Math.min(Math.max(newScale, 0.5), 4) // 限制缩放范围 } lastDistance.value = distance } } // 触摸结束 const handleTouchEnd = () => { console.log('handleTouchEnd') lastDistance.value = -1 isDragging.value = false } // 按钮点击事件处理函数 const handleDraw = () => { draw(); // 调用绘图函数 } // onMounted(() => { // setInterval(()=>{ // draw() // },300) // // 确保在组件挂载后可以获取到Canvas元素 // }) onReady(() => { console.log('onReadyonReady'); uni.downloadFile({ url:imgUrl.value, success: function (sres) { console.log(sres,'sres'); imgUrl.value = sres.tempFilePath || sres.path draw() },fail:function(fres){ console.log('fres',fres) } }) }) </script> <style scoped> button { margin-top: 10px; } </style>