From 3500a34fc17827eef64ca0b7e4b2a3121b24ab5b Mon Sep 17 00:00:00 2001
From: zs <zhousong@weben-smart.com>
Date: 周二, 29 4月 2025 17:33:29 +0800
Subject: [PATCH] 去掉生成的代码
---
HIAWms/web/src/components/TouchScale/index.vue | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 178 insertions(+), 0 deletions(-)
diff --git a/HIAWms/web/src/components/TouchScale/index.vue b/HIAWms/web/src/components/TouchScale/index.vue
new file mode 100644
index 0000000..1ea6efc
--- /dev/null
+++ b/HIAWms/web/src/components/TouchScale/index.vue
@@ -0,0 +1,178 @@
+<template>
+ <div class="_touchScale">
+ <slot></slot>
+ <div class="_touch-mask" v-if="isShowMask"></div>
+ </div>
+</template>
+<script lang="ts" setup>
+import { onMounted, computed, reactive } from 'vue'
+const store: any = reactive({
+ scale: 1,
+})
+
+const decomposeMatrix = (matrix: string) => {
+ // 浣跨敤姝e垯琛ㄨ揪寮忔彁鍙栫煩闃典腑鐨勬暟鍊奸儴鍒�
+ const matrixRegex = /matrix\((.+),\s*(.+),\s*(.+),\s*(.+),\s*(.+),\s*(.+)/
+ const matches = matrix.match(matrixRegex)
+
+ if (!matches) {
+ throw new Error('閿欒')
+ }
+
+ // 鎻愬彇骞崇Щ鍜岀缉鏀惧��
+ const scaleX = parseFloat(matches[1])
+ const scaleY = parseFloat(matches[4])
+ const translateX = parseFloat(matches[5])
+ const translateY = parseFloat(matches[6])
+
+ return {
+ translate: { x: translateX, y: translateY },
+ scale: { x: scaleX, y: scaleY },
+ }
+}
+
+const isShowMask = computed(() => store.isShowMask)
+
+const initEvent = () => {
+ const ele: any = document.querySelector('._touchScale')
+
+ // 缂╂斁浜嬩欢鐨勫鐞�
+ ele.addEventListener('touchstart', function (event: any) {
+ const touches = event?.touches
+ const events = touches[0]
+ const events2 = touches[1]
+
+ // 绗竴涓Е鎽哥偣鐨勫潗鏍�
+ store.pageX = events.pageX
+ store.pageY = events.pageY
+ store.moveable = true
+ store.originScale = store.scale || 1
+ const transform = window.getComputedStyle(ele, null).transform
+ if (transform !== 'none') {
+ store.matrix = decomposeMatrix(transform)
+ }
+ if (events2) {
+ store.pageX2 = events2.pageX
+ store.pageY2 = events2.pageY
+ } else {
+ // 鍙屽嚮
+ store.isDbl = false
+ if (!store.t) {
+ store.t = Date.now()
+ } else {
+ const t = Date.now() - store.t
+ if (t <= 400) {
+ store.isDbl = true
+ }
+ store.t = null
+ }
+ }
+ if (store.isDbl) {
+ store.scale = store.scale - 0.1
+ const translateX = store.matrix?.translate?.x || 0
+ const translateY = store.matrix?.translate?.y || 0
+ ele.style.transform = `translate(${translateX}px, ${translateY}px) scale(${store.scale})`
+ }
+ })
+
+ document.addEventListener('touchmove', function (event: any) {
+ if (!store.moveable) {
+ return
+ }
+ store.t = null
+ store.isDbl = false
+ store.isShowMask = true
+ event.preventDefault()
+
+ var touches = event.touches
+ var events = touches[0]
+ var events2 = touches[1]
+ const translateX = store.matrix?.translate?.x || 0
+ const translateY = store.matrix?.translate?.y || 0
+ // 鍙屾寚绉诲姩
+ if (events2) {
+ // 绗�2涓寚澶村潗鏍囧湪touchmove鏃跺�欒幏鍙�
+ if (!store.pageX2) {
+ store.pageX2 = events2.pageX
+ }
+ if (!store.pageY2) {
+ store.pageY2 = events2.pageY
+ }
+
+ // 鑾峰彇鍧愭爣涔嬮棿鐨勪妇渚�
+ var getDistance = function (start: any, stop: any) {
+ return Math.hypot(stop.x - start.x, stop.y - start.y)
+ }
+ // 鍙屾寚缂╂斁姣斾緥璁$畻
+ var zoom =
+ getDistance(
+ {
+ x: events.pageX,
+ y: events.pageY,
+ },
+ {
+ x: events2.pageX,
+ y: events2.pageY,
+ }
+ ) /
+ getDistance(
+ {
+ x: store.pageX,
+ y: store.pageY,
+ },
+ {
+ x: store.pageX2,
+ y: store.pageY2,
+ }
+ )
+ // 搴旂敤鍦ㄥ厓绱犱笂鐨勭缉鏀炬瘮渚�
+ var newScale = store.originScale * zoom
+ // 鏈�澶х缉鏀炬瘮渚嬮檺鍒�
+ // if (newScale > 3) {
+ // newScale = 3
+ // }
+ // 璁颁綇浣跨敤鐨勭缉鏀惧��
+ store.scale = newScale
+
+ // 鍥惧儚搴旂敤缂╂斁鏁堟灉
+ ele.style.transform = `translate(${translateX}px, ${translateY}px) scale(${store.scale})`
+ } else {
+ // 鍗曟寚绉诲姩
+ const x = events.pageX - store.pageX + translateX
+ const y = events.pageY - store.pageY + translateY
+
+ ele.style.transform = `translate(${x}px, ${y}px) scale(${store.scale})`
+ }
+ })
+
+ document.addEventListener('touchend', function () {
+ store.moveable = false
+ store.isShowMask = false
+ delete store.pageX2
+ delete store.pageY2
+ })
+ document.addEventListener('touchcancel', function () {
+ store.moveable = false
+ store.isShowMask = false
+
+ delete store.pageX2
+ delete store.pageY2
+ })
+}
+onMounted(() => initEvent())
+</script>
+
+<style lang="scss" scoped>
+._touchScale {
+ width: fit-content;
+ height: fit-content;
+ position: relative;
+ ._touch-mask {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+}
+</style>
--
Gitblit v1.9.3