"use strict"; const common_vendor = require("../../common/vendor.js"); const pages_index_transformMatrix = require("./transform-matrix.js"); const pages_index_gestureHandler = require("./gesture-handler.js"); const TransformCanvas = () => "./transform-canvas.js"; const _sfc_main = { components: { TransformCanvas }, data() { return { canvasWidth: 300, canvasHeight: 300, transformMatrix: new pages_index_transformMatrix.TransformMatrix(), gestureHandler: null, containerRect: null, gestureStatus: "等待手势...", scaleValue: 1, touchPoints: 0, lastGestureTime: 0 }; }, async mounted() { await this.getContainerPosition(); this.initGestureHandler(); this.$nextTick(() => { this.updateCanvas(); }); }, methods: { // 独立的手势初始化方法 initGestureHandler() { try { this.gestureHandler = new pages_index_gestureHandler.GestureHandler(this, this.transformMatrix, { container: this.containerRect }); } catch (e) { common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:77", "手势处理器初始化失败:", e); this.gestureHandler = { catchEvent: (event) => { const touches = event.touches || []; if (touches.length > 0) { const point = touches[0]; const x = point.clientX - this.containerRect.left; const y = point.clientY - this.containerRect.top; this.transformMatrix.tx = x - 50; this.transformMatrix.ty = y - 50; this.updateCanvas(); } } }; } }, async getContainerPosition() { let retryCount = 0; const maxRetries = 3; while (retryCount < maxRetries) { try { const rect = await new Promise((resolve) => { const query = common_vendor.index.createSelectorQuery().in(this); query.select(".gesture-container").boundingClientRect((res) => { resolve(res); }).exec(); }); if (rect) { this.containerRect = { left: rect.left, top: rect.top, width: rect.width, height: rect.height }; common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:119", "成功获取容器位置:", this.containerRect); return; } } catch (e) { common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:123", "获取容器位置失败:", e); } await new Promise((r) => setTimeout(r, 100)); retryCount++; } common_vendor.index.__f__("error", "at pages/index/gesture-canvas-page.vue:131", `容器位置获取失败,已重试${maxRetries}次`); }, // 事件处理(完整修复) async handleTouchEvent(event) { if (!this.gestureHandler || !this.containerRect) { common_vendor.index.__f__("warn", "at pages/index/gesture-canvas-page.vue:137", "手势处理器未就绪,尝试重新初始化..."); await this.getContainerPosition(); this.initGestureHandler(); if (this.gestureHandler) { return this.handleTouchEvent(event); } return; } const currentTime = Date.now(); this.touchPoints = event.touches.length; const correctedTouches = Array.from(event.touches).map((touch) => { const x = touch.clientX - this.containerRect.left; const y = touch.clientY - this.containerRect.top; common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:160", `原始坐标: (${touch.clientX}, ${touch.clientY}) 修正后: (${x}, ${y})`); return { ...touch, x, y }; }); const correctedEvent = { ...event, touches: correctedTouches, changedTouches: correctedTouches }; this.gestureHandler.catchEvent(correctedEvent); if (event.type === "touchstart") { this.gestureStatus = event.touches.length > 1 ? "双指开始" : "单指开始"; } else if (event.type === "touchmove") { this.gestureStatus = event.touches.length > 1 ? "双指缩放/移动" : "单指移动"; } else { this.gestureStatus = "结束"; } if (currentTime - this.lastGestureTime > 50) { this.lastGestureTime = currentTime; this.updateCanvas(); } }, // 更新Canvas(性能优化版) updateCanvas() { this.$nextTick(() => { const canvas = this.$refs.canvasRef; if (canvas) { canvas.draw(); this.scaleValue = Math.sqrt( this.transformMatrix.a * this.transformMatrix.a + this.transformMatrix.b * this.transformMatrix.b ); } }); }, // 重置画布 resetCanvas() { this.transformMatrix.reset(); this.scaleValue = 1; this.gestureStatus = "画布已重置"; this.updateCanvas(); }, // 放大 zoomIn() { this.transformMatrix.scale(1.2, 1.2, this.canvasWidth / 2, this.canvasHeight / 2); this.updateCanvas(); }, // 缩小 zoomOut() { this.transformMatrix.scale(0.8, 0.8, this.canvasWidth / 2, this.canvasHeight / 2); this.updateCanvas(); }, // 调试输出 logMatrix() { common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:235", "当前变换矩阵:", this.transformMatrix.toArray()); common_vendor.index.__f__("log", "at pages/index/gesture-canvas-page.vue:236", "容器位置:", this.containerRect); if (this.$refs.canvasRef) { this.$refs.canvasRef.drawDebugGrid(); } } } }; if (!Array) { const _component_transform_canvas = common_vendor.resolveComponent("transform-canvas"); _component_transform_canvas(); } function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return { a: common_vendor.t($data.scaleValue.toFixed(2)), b: common_vendor.t($data.transformMatrix.tx.toFixed(1)), c: common_vendor.t($data.transformMatrix.ty.toFixed(1)), d: common_vendor.t($data.gestureStatus), e: common_vendor.t($data.touchPoints), f: common_vendor.sr("canvasRef", "2e633000-0"), g: common_vendor.p({ width: $data.canvasWidth, height: $data.canvasHeight, matrix: $data.transformMatrix }), h: common_vendor.o((...args) => $options.handleTouchEvent && $options.handleTouchEvent(...args)), i: common_vendor.o((...args) => $options.handleTouchEvent && $options.handleTouchEvent(...args)), j: common_vendor.o((...args) => $options.handleTouchEvent && $options.handleTouchEvent(...args)), k: common_vendor.o((...args) => $options.handleTouchEvent && $options.handleTouchEvent(...args)), l: common_vendor.o((...args) => $options.resetCanvas && $options.resetCanvas(...args)), m: common_vendor.o((...args) => $options.zoomIn && $options.zoomIn(...args)), n: common_vendor.o((...args) => $options.zoomOut && $options.zoomOut(...args)), o: common_vendor.o((...args) => $options.logMatrix && $options.logMatrix(...args)) }; } const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2e633000"]]); wx.createPage(MiniProgramPage); //# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/gesture-canvas-page.js.map