Skip to content

v-pinch

双指缩放手势检测。

起始版本: 1.5.0

用法

基本

vue
<template>
  <div v-pinch="handlePinch">双指缩放</div>
</template>

<script setup>
function handlePinch(e) {
  console.log('缩放比例:', e.scale)
  console.log('中心点:', e.centerX, e.centerY)
}
</script>

应用缩放变换

vue
<template>
  <div v-pinch="{
    onPinch: handlePinch,
    enableTransform: true,
    minScale: 0.5,
    maxScale: 3
  }">
    可缩放的元素
  </div>
</template>

API

PinchEvent

属性类型描述
originalEventTouchEvent原始事件
scalenumber缩放比例(相对于开始)
distancenumber当前两指距离
initialDistancenumber初始两指距离
centerXnumber中心点 X 坐标
centerYnumber中心点 Y 坐标
isPinchingboolean是否正在缩放
isFirstboolean是否刚开始
isFinalboolean是否已结束

选项

选项类型默认值描述
onStart(e: PinchEvent) => void-缩放开始回调
onPinch(e: PinchEvent) => void-缩放中回调
onEnd(e: PinchEvent) => void-缩放结束回调
minScalenumber-最小缩放比例
maxScalenumber-最大缩放比例
preventDefaultbooleantrue是否阻止默认行为
stopPropagationbooleanfalse是否阻止事件冒泡
enableTransformbooleanfalse是否应用缩放变换
transformOriginstring'center center'变换原点

绑定值类型

ts
type PinchBinding = PinchOptions['onPinch'] | PinchOptions

Composable 用法

你也可以使用 usePinch composable 来实现相同功能:

vue
<script setup>
import { ref, onMounted } from 'vue'
import { usePinch } from 'directix'

const containerRef = ref(null)
const { isPinching, scale, bind } = usePinch({
  onPinch: (e) => console.log('缩放:', e.scale),
  minScale: 0.5,
  maxScale: 3
})

onMounted(() => bind(containerRef.value))
</script>

<template>
  <div ref="containerRef">双指缩放</div>
  <p v-if="isPinching">正在缩放: {{ scale.toFixed(2) }}x</p>
</template>

API

typescript
interface PinchEvent {
  scale: number
  distance: number
  initialDistance: number
  centerX: number
  centerY: number
  isPinching: boolean
  isFirst: boolean
  isFinal: boolean
}

interface UsePinchOptions {
  /** 缩放开始回调 */
  onStart?: (e: PinchEvent) => void
  /** 缩放中回调 */
  onPinch?: (e: PinchEvent) => void
  /** 缩放结束回调 */
  onEnd?: (e: PinchEvent) => void
  /** 最小缩放比例 */
  minScale?: number
  /** 最大缩放比例 */
  maxScale?: number
  /** 是否应用变换 */
  enableTransform?: boolean
}

interface UsePinchReturn {
  /** 是否正在缩放 */
  isPinching: Ref<boolean>
  /** 当前缩放比例 */
  scale: Ref<number>
  /** 绑定到元素 */
  bind: (element: HTMLElement) => () => void
}

基于 MIT 许可发布