最近在做一个微信端商城项目,其中一个大的模块就是定制。用户自己选择、上传素材或编辑文字,然后能对素材进行拖曳、旋转和缩放放大的效果。第一次接触所以百度了很多大家比较推荐的是百度云Clouda团队维护,也是在百度内部广泛使用的开发工具touch.js。不过在开发过程中遇到了很过问题。当我重新创建个div后需要接触前一个div的手势事件,我查找了很多资料了touch.js 的api,虽然文档上说用touch.off能解除事件可是会报错提示pinch、drag等手势define,一直都没找到解决的方法。然后在搜索中还发现了另一个手势插件hammer,hammer是个开源的库而且体积小巧。hammer很好的解决了我的问题,下面是我自己整合的项目中需要用到的手势事件:要先引入hammer.js文件
var rotateVal=0;//旋转值
var scaleVal=1;//缩放值
var catHammer = {
init:function (objHammer) {
objHammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
objHammer.add(new Hammer.Swipe()).recognizeWith(objHammer.get('pan'));
objHammer.add(new Hammer.Rotate({ threshold: 0 })).recognizeWith(objHammer.get('pan'));
objHammer.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith([objHammer.get('pan'), objHammer.get('rotate')]);
objHammer.add(new Hammer.Tap({ event: 'doubletap', taps: 2 }));
objHammer.add(new Hammer.Tap());
},
//拖动
drag:function (objHammer,element) {
var START_X =0,START_Y=0;
objHammer.on('panstart panmove',function (event) {//拖动开始、移动
event.preventDefault();
element.style.left =START_X +event.deltaX+ 'px';
element.style.top = START_Y +event.deltaY+'px';
});
objHammer.on('panend',function (event) {//拖动结束
event.preventDefault();
START_X += event.deltaX ;
START_Y += event.deltaY;
console.log("START_X==="+START_X);
console.log("START_Y==="+START_Y)
});
},
//旋转
setrotate:function (objHammer, element) {
var initAngle = 0;
objHammer.on('rotatestart rotatemove',function (event) {
event.preventDefault();
rotateVal = initAngle+event.rotation
element.style.transform = 'rotate('+rotateVal+'deg) scale('+scaleVal+')';
});
objHammer.on('rotateend',function (event) {
event.preventDefault();
initAngle = initAngle+event.rotation;
})
},
//缩放
setScale:function (objHammer, element) {
var initScale = 1;
var currentScale;
objHammer.on('pinchstart pinchmove ',function (event) {
event.preventDefault();
currentScale = event.scale - 1;
currentScale = initScale + currentScale
scaleVal = currentScale;
element.style.transform = 'rotate('+rotateVal+'deg) scale('+scaleVal+')';
});
objHammer.on('pinchend',function (event) {
event.preventDefault();
initScale = currentScale;
})
},
//解除事件
setoff:function (objHammer) {
// objHammer.off("");
console.log('off');
objHammer.off("panstart panmove panend pinchstart pinchmove pinchend rotatestart rotatemove pinchend")
}
}
然后直接调用catHammer。
$(function){
var element = document.getElementById('target');
var objHammer = new Hammer(element);//创建一个实例objHammer
catHammer.init(objHammer);//初始化
catHammer.drag(objHammer,element);//拖曳
catHammer.setrotate(objHammer,element);//旋转
catHammer.setScale(objHammer,element);//缩放
}
更多推荐
移动端手势hammer
发布评论