js+仿android时钟,Android 系统下用 js 自定义 gesture 事件 (仿 ios 实现移动端事件一致)...

Android 系统下用 js 自定义 gesture 事件 (仿 ios 实现移动端事件一致)

一, 手势事件

在 ios 系统中, 系统自带了 gesture 事件, 两个手指操作的时候, 就会产生一下三种手势事件:

gesturestart: 当一个手指已经按在屏幕上, 另一个手指又触摸屏幕的时候触发.

gesturechange: 当触摸屏幕的任何一个手指的位置发生变化的时候触发.

gestureend: 当任何一个手指从屏幕上面移开时触发.

这里通过 js 自定义事件模仿 ios 的手势事件为 Android 添加相同的功能;

实现基本思路

在 Android 中我们可以监听 touchstart,touchmove,touchend 去实现手势事件的监听,

当触发 touch 事件的时候, 会生成一个 TouchEvent 对象, 我们可通过其属性 e.touches.length 来判断是否多点触控, 通过 e.touches[index].pageX,e.touches[index].pageY 获取去触点坐标, 通过 e.target 获取 dom 节点;

实现方法

1, 创建自定义事件vargesturestart=newCustomEvent('gesturestart');

vargesturechange=newCustomEvent('gesturestart');

vargestureend=newCustomEvent('gesturestart');

1,gesturestart

首先定义两个变量存储触发状态和起始点信息varistouch=false;

ar start=[];

监听 touchstart 事件, 通过 e.touches.length>2 判断是否多点触控, 如果是, 触发自定义事件 gesturestartdocument.addEventListener("touchstart",function(e){

if(e.touches.length>=2){// 判断是否有两个点在屏幕上

istouch=true;

start=e.touches;// 得到第一组两个点

e.target.dispatchEvent(gesturestart);

};

},false);

2,gesturechange

gesturechange 事件中我们需在事件对象中返回以下两个属性:

scale: 表示两个手指之间的距离情况, 向内收缩会缩短距离, 这个值从 1 开始, 并随距离拉大而增长

rotation: 表示手指变化引起的旋转角度, 负值表示逆时针, 正值表示顺时针, 从零开始.

对于两点间的距离我们可由以下公式计算

(1) 缩放比例可通过两组点之间的长度比计算

scale = dis1 / dis2

首先编写方法两点之间距离的方法 (勾股定理)

ab7653affab982b574eb7acc55df2e04.giffunctiongetDistance(p1,p2){

varx=p2.pageX-p1.pageX,

y=p2.pageY-p1.pageY;

returnMath.sqrt((x*x)+(y*y));

};

(2) 对于旋转角度第一组点的夹角与第二组点的夹角相减得到

deg= deg2-deg1 =arctan (x2-x1/y2-y1) - arctan (x4-x3/y4-y3)

编写获取夹角方法 (反三角函数求夹角, 注意弧度转化为角度)functiongetAngle(p1,p2){

varx=p1.pageX-p2.pageX,

y=p1.pageY-p2.pageY;

returnMath.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){

varnow=e.touches;// 得到第二组触点

varscale=getDistance(now[0],now[1])/getDistance(start[0],start[1]);// 得到缩放比例

varrotation=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);

3,gestureend

监听 touchend 事件, 通过 istouch 判断是否触发 gestureend 事件document.addEventListener("touchend",function(e){

if(istouch){

istouch=false;

e.target.dispatchEvent(gestureend);

};

},false);

4, 系统环境判断functionisAndroid(p1,p2){

varu=navigator.userAgent;

returnu.indexOf('Android')>-1||u.indexOf('Adr')>-1;// 是否 android 终端

};

封装以上方法并执行, 即可实现安卓端与 ios 的手势事件兼容

[1]: 部分代码参考 https://blog.youkuaiyun.com/qq_17757973/article/details/54604625

来源: https://www.cnblogs.com/pangys/p/9119845.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值