下面二维码是一个实例dome,可扫码直接查看:javascript
在ios系统中,系统自带了gesture事件,两个手指操做的时候,就会产生一下三种手势事件:html
gesturestart:当一个手指已经按在屏幕上,另外一个手指又触摸屏幕的时候触发。
gesturechange:当触摸屏幕的任何一个手指的位置发生变化的时候触发。
gestureend:当任何一个手指从屏幕上面移开时触发。 java
这里经过js自定义事件模仿ios的手势事件为Android添加相同的功能;android
在Android中咱们能够监听touchstart、touchmove、touchend去实现手势事件的监听,
当触发touch事件的时候,会生成一个TouchEvent对象,咱们可经过其属性e.touches.length来判断是否多点触控,经过e.touches[index].pageX,e.touches[index].pageY获取去触点坐标,经过e.target获取dom节点;ios
var gesturestart = new CustomEvent('gesturestart');
var gesturechange = new CustomEvent('gesturechange');
var gestureend = new CustomEvent('gestureend');
首先定义两个变量存储触发状态和起始点信息nginx
var istouch = false;
ar start = [];
监听touchstart事件,经过e.touches.length>2判断是否多点触控,若是是,触发自定义事件gesturestartgit
document.addEventListener("touchstart", function(e) {
if(e.touches.length >= 2) { //判断是否有两个点在屏幕上
istouch = true;
start = e.touches; //获得第一组两个点
e.target.dispatchEvent(gesturestart);
};
}, false);
gesturechange事件中咱们需在事件对象中返回如下两个属性:github
(1)缩放比例可经过两组点之间的长度比计算web
scale = dis1 / dis2
首先编写方法两点之间距离的方法(勾股定理)app
function getDistance(p1, p2) {
var x = p2.pageX - p1.pageX,
y = p2.pageY - p1.pageY;
return Math.sqrt((x * x) + (y * y));
};
(2)对于旋转角度第一组点的夹角与第二组点的夹角相减获得
deg= deg2-deg1 =arctan (x2-x1/y2-y1) - arctan (x4-x3/y4-y3)
编写获取夹角方法(反三角函数求夹角,注意弧度转化为角度)
function getAngle(p1, p2) {
var x = p1.pageX - p2.pageX,
y = p1.pageY - p2.pageY;
return Math.atan2(y, x) * 180 / Math.PI;
};
监听touchmove事件,经过e.touches.length >= 2和istouch判断是否触发gesturechange事件
document.addEventListener("touchmove", function(e) {
e.preventDefault();
if(e.touches.length >= 2 && istouch) {
var now = e.touches; //获得第二组触点
var scale = getDistance(now[0], now[1]) / getDistance(start[0], start[1]); //获得缩放比例
var rotation = getAngle(now[0], now[1]) - getAngle(start[0], start[1]); //获得旋转角度
gesturechange.scale = scale.toFixed(2);
gesturechange.rotation = rotation.toFixed(2);
e.target.dispatchEvent(gesturechange);
};
}, false);
监听touchend事件,经过istouch判断是否触发gestureend 事件
document.addEventListener("touchend", function(e) {
if(istouch) {
istouch = false;
e.target.dispatchEvent(gestureend);
};
}, false);
function isAndroid(p1, p2) {
var u = navigator.userAgent;
return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //是否android终端
};
封装以上方法并执行,便可实现安卓端与ios的手势事件兼容
完整代码见https://github.com/pangyongsheng/pangyongsheng.github.io/tree/master/gesture
[1]: 部分代码参考https://blog.csdn.net/qq_17757973/article/details/54604625