主题
LimeGesture 手势库组件
一个功能强大的手势处理库,支持旋转、缩放、滑动等多种触摸交互。适用于需要实现拖拽、缩放、旋转等复杂手势交互的场景,如图片编辑器、地图操作、画布交互等。组件提供了丰富的事件回调和状态管理,可以满足各种复杂的交互需求。
文档链接
📚 组件详细文档请访问以下站点:
安装方法
代码演示
基础用法
通过引用元素实现旋转、缩放和移动功能。
html
<view ref="boxRef" class="box" style="background-color: #44bd87;"></view>
js
import { useGesture, type GestureOptions } from '@/uni_modules/lime-gesture'
const boxRef = ref(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)`)
})
手动模式
在某些环境不支持直接绑定事件的情况下,可以手动传递触摸事件。
html
<view
ref="boxRef"
class="box"
style="background-color: #44bd87;"
@touchstart="touchstart"
@touchmove="touchmove"
@touchend="touchend">
</view>
js
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 touchstartt = (e : UniTouchEvent) => {
gesture.start(e)
}
// 传入移动事件
const touchmovet = (e : UniTouchEvent) => {
e.preventDefault()
gesture.move(e)
}
// 传入移动结束事件
const touchendt = (e : UniTouchEvent) => {
gesture.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)`)
})
快速预览
导入插件后,可以直接使用以下标签查看演示效果:
html
<!-- 代码位于 uni_modules/lime-gesture/components/lime-gesture -->
<lime-gesture />
插件标签说明
标签名 | 说明 |
---|---|
l-gesture | 组件标签 |
lime-gesture | 演示标签 |
Vue2使用说明
main.js中添加以下代码:
js
// vue2项目中使用
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)
详细配置请参考官方文档:Vue Composition API
API文档
状态对象 (GestureState)
js
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 : 原始触摸事件对象 |
方法
方法名 | 说明 | 参数 |
---|---|---|
start | 手动模式下处理触摸开始事件 | (evt: UniTouchEvent) => void |
move | 手动模式下处理触摸移动事件 | (evt: UniTouchEvent) => void |
end | 手动模式下处理触摸结束事件 | (evt: UniTouchEvent) => void |
cancel | 手动模式下处理触摸取消事件 | (evt: UniTouchEvent) => void |
常见问题
- 在某些平台上可能需要阻止默认的触摸行为,可以在touchmove事件中调用e.preventDefault()
- 手势识别的精度可能受设备性能和触摸屏质量的影响
- 复杂手势组合(如同时旋转和缩放)在某些低端设备上可能会有性能问题
支持与赞赏
如果你觉得本插件解决了你的问题,可以考虑支持作者:
支付宝赞助 | 微信赞助 |
---|---|
![]() | ![]() |