更新记录
0.0.2(2025-03-12)
0.0.1(2025-03-07)
平台兼容性
App |
快应用 |
微信小程序 |
支付宝小程序 |
百度小程序 |
字节小程序 |
QQ小程序 |
HBuilderX 4.53,Android:支持,iOS:支持,HarmonyNext:不确定 |
× |
√ |
× |
× |
× |
× |
钉钉小程序 |
快手小程序 |
飞书小程序 |
京东小程序 |
鸿蒙元服务 |
× |
× |
× |
× |
× |
H5-Safari |
Android Browser |
微信浏览器(Android) |
QQ浏览器(Android) |
Chrome |
IE |
Edge |
Firefox |
PC-Safari |
√ |
√ |
√ |
√ |
√ |
× |
× |
× |
× |
lime-gesture 手势库
安装
插件市场导入即可
代码演示
<view ref="boxRef" class="box" style="background-color: #44bd87;"></view>
import { useGesture, type GestureOptions } from '@/uni_modules/lime-gesture'
const boxRef = ref<UniElement | null>(null)
const translateX = ref(0)
const translateY = ref(0)
const scale = ref(1)
const rotation = ref(0)
const gesture = useGesture(boxRef, {
//缩放
onPinch(zoom : number, _evt : UniTouchEvent) {
scale.value = Math.min(Math.max(zoom, 0.5), 5)
},
// 旋转
onRotate(angle : number, _evt : UniTouchEvent) {
rotation.value += angle
},
// 单指移动
onPressMove(delta, _evt : UniTouchEvent) {
translateX.value += delta["deltaX"] as number
translateY.value += delta["deltaY"] as number
},
// 双指移动
onTwoPressMove(delta, _evt : UniTouchEvent) {
translateX.value += delta["deltaX"] as number
translateY.value += delta["deltaY"] as number
}
} as GestureOptions)
// 给元素绑定加上
watchEffect(() => {
if (boxRef.value == null) return
boxRef.value!.style.setProperty('transform', `translate(${translateX.value}px, ${translateY.value}px) scale(${scale.value}) rotate(${rotation.value}deg)`)
})
手动模式
某些环境不支持给绑定事件,给useGesture
第一个参数传入null
,手动传递触摸事件(适用于复杂场景):
<view
ref="boxRef"
class="box"
style="background-color: #44bd87;"
@touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
</view>
const boxRef = ref<UniElement | null>(null)
const gesture = useGesture(null, {
//缩放
onPinch(zoom : number, _evt : UniTouchEvent) {
scale.value = Math.min(Math.max(zoom, 0.5), 5)
},
// 旋转
onRotate(angle : number, _evt : UniTouchEvent) {
rotation.value += angle
},
// 单指移动
onPressMove(delta, _evt : UniTouchEvent) {
translateX.value += delta["deltaX"] as number
translateY.value += delta["deltaY"] as number
},
// 双指移动
onTwoPressMove(delta, _evt : UniTouchEvent) {
translateX.value += delta["deltaX"] as number
translateY.value += delta["deltaY"] as number
}
} as GestureOptions)
// 传入开始事件
const touchstart = (e : UniTouchEvent) => {
gesture.start(e)
}
// 传入移动事件
const touchmove = (e : UniTouchEvent) => {
e.preventDefault()
finger.move(e)
}
// 传入移动结束事件
const touchend = (e : UniTouchEvent) => {
finger.end(e)
}
// 给元素绑定加上
watchEffect(() => {
if (boxRef.value == null) return
boxRef.value!.style.setProperty('transform', `translate(${translateX.value}px, ${translateY.value}px) scale(${scale.value}) rotate(${rotation.value}deg)`)
})
状态对象 (GestureState)
interface GestureState {
scale: number // 当前缩放比例
angle: number // 累计旋转角度
deltaX: number // X轴瞬时位移
deltaY: number // Y轴瞬时位移
isDoubleTap: boolean // 是否为双击
swipeDirection: 'Left' | 'Right' | 'Up' | 'Down' | null
}
⚙️ 配置选项 (GestureOptions)
属性名 |
类型 |
触发时机 |
参数说明 |
onRotate |
(angle: number, evt: UniTouchEvent) => void |
双指旋转时持续触发 |
angle : 旋转角度(相对上次变化量,单位:度)
evt : 原始触摸事件对象 |
onPinch |
(scale: number, evt: UniTouchEvent) => void |
双指缩放时持续触发 |
scale : 缩放比例(相对初始距离的倍数)
evt : 原始触摸事件对象 |
onSwipe |
(direction: 'Left'\|'Right'\|'Up'\|'Down', evt: UniTouchEvent) => void |
快速滑动结束时触发(速度>30px/300ms) |
direction : 滑动方向
evt : 原始触摸事件对象 |
onTap |
(evt: UniTouchEvent) => void |
单击结束时触发 |
evt : 原始触摸事件对象 |
onDoubleTap |
(evt: UniTouchEvent) => void |
快速双击时触发(间隔<250ms) |
evt : 原始触摸事件对象 |
onLongTap |
(evt: UniTouchEvent) => void |
长按超过750ms时触发 |
evt : 原始触摸事件对象 |
onSingleTap |
(evt: UniTouchEvent) => void |
单击未被双击覆盖时触发(延迟250ms触发) |
evt : 原始触摸事件对象 |
onPressMove |
(delta: UTSJSONObject, evt: UniTouchEvent) => void |
单指拖拽时持续触发 |
delta : 包含 deltaX/deltaY 的位移对象
evt : 原始触摸事件对象 |
onTwoPressMove |
(delta: UTSJSONObject, evt: UniTouchEvent) => void |
双指拖拽时持续触发 |
delta : 包含 deltaX/deltaY 的位移对象
evt : 原始触摸事件对象 |
onTouchStart |
(evt: UniTouchEvent) => void |
触摸开始时触发 |
evt : 原始触摸事件对象 |
onTouchMove |
(evt: UniTouchEvent) => void |
触摸移动时触发 |
evt : 原始触摸事件对象 |
onTouchEnd |
(evt: UniTouchEvent) => void |
触摸结束时触发 |
evt : 原始触摸事件对象 |
onTouchCancel |
(evt: UniTouchEvent) => void |
触摸被系统取消时触发(如来电打断) |
evt : 原始触摸事件对象 |
onMultipointStart |
(evt: UniTouchEvent) => void |
从单点触摸变为多点触摸时触发 |
evt : 原始触摸事件对象 |
onMultipointEnd |
(evt: UniTouchEvent) => void |
从多点触摸变为单点/无触摸时触发 |
evt : 原始触摸事件对象 |