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

庞永胜      2022-02-08     374

关键词:

 

一、手势事件

下面二维码是一个实例dome,可扫码直接查看:

在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、创建自定义事件
var gesturestart = new CustomEvent('gesturestart');
var gesturechange = new CustomEvent('gesturechange');
var gestureend = new CustomEvent('gestureend');

1、gesturestart

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

var istouch = false;
ar start = [];

监听touchstart事件,通过e.touches.length>2判断是否多点触控,如果是,触发自定义事件gesturestart

document.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
      首先编写方法两点之间距离的方法(勾股定理)

  

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

3、gestureend

监听touchend事件,通过istouch判断是否触发gestureend 事件

document.addEventListener("touchend", function(e) {
if(istouch) {
istouch = false;
e.target.dispatchEvent(gestureend);
};
}, false);

4、系统环境判断

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

js-自定义事件

1、自定义事件开发人员自己定义的事件,是除了系统以外的事件。可以供其他开发人员使用,有利于多人写作开发,可扩展js的原有事件。需要:事件绑定器、事件触发器2、自定义事件三要素  ①:对象、事件名、事件处理... 查看详情

事件处理机制之gestures(手势)

...如左右上下滑动屏幕,又或者画一些不规则的几何图形!Android对上述两种手势行为都提供了支持:Android提供手势检测,并为手势识别提供了相应的监听器!Android运行开发者自行添加手势,并且提供了相应的API识别用户手势!如... 查看详情

js自定义事件dom/伪dom自定义事件

所谓自定义事件,就是有别于有别于带有浏览器特定行为的事件(类似click, mouseover, submit, keydown等事件),事件名称可以随意定义,可以通过特定的方法进行添加,触发以及删除。JS自定义事件先看个简单的事件添加的... 查看详情

自定义事件js

//原理如下//创建类型为HTMLEvents的事件varevt=document.createEvent("HTMLEvents");//初始化自定义eee事件evt.initEvent("eee",false,false);//事件绑定document.addEventListener("eee",function(e){console.log(e)})//document标签触发事件(直接运 查看详情

js自定义事件模式

...-  js事件用的最多的就是默认事件。不过有时候需要自定义事件来使用。  参照默认事件的模式,例如click事件,鼠标点击dom,先触发click事件,然后执行dom上的事件处理程序。<p>点我</p>document.getElementByTagName(‘p‘)[0... 查看详情

Android 自定义事件监听器

】Android自定义事件监听器【英文标题】:Androidcustomlistenerforanevent【发布时间】:2017-02-1807:27:04【问题描述】:我试图在更新整数值时触发一个事件,但它失败了。这是我正在使用的代码:声明自定义监听器publicclassfieldactivityexte... 查看详情

java示例代码_在Android中定义自定义事件和事件侦听器

java示例代码_在Android中定义自定义事件和事件侦听器 查看详情

Vue.js 自定义事件问题

】Vue.js自定义事件问题【英文标题】:Vue.jscustomeventissue【发布时间】:2018-12-2517:32:51【问题描述】:我已经尝试解决这个问题好几个小时了,但我不确定我的vue自定义事件出了什么问题。<!--partofthevuetemplate:themainelement--><!... 查看详情

Android 自定义事件监听器

】Android自定义事件监听器【英文标题】:AndroidCustomEventListener【发布时间】:2012-01-0717:27:19【问题描述】:假设我想为我的班级制作自己的事件监听器,我该怎么做?我需要手动维护线程吗?【问题讨论】:查看CodePath主题Creatin... 查看详情

js自定义事件

自定义事件(简单版)letEvent=/*绑定事件Event.on('log',function(param1,param2)//绑定一个log事件,并接收param1和param2参数console.log(1,param1,param2))*/on(event,cb)if(!this.handles)this.handles=if(!this.ha 查看详情

js自定义事件

<!DOCTYPEhtml><html><headlang="zh-CN"><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1"/><title></title><style>.butt 查看详情

在 React Native Android 上定义自定义原生事件

】在ReactNativeAndroid上定义自定义原生事件【英文标题】:DefiningacustomnativeeventonReactNativeAndroid【发布时间】:2017-02-1319:24:22【问题描述】:我正在尝试在Android上的ReactNative应用程序中定义一个自定义事件。我有原生视图,它有一... 查看详情

js的自定义事件

js中的事件是js的一大技术点,说白了就是操作dom树的唯一途径。关于事件无非两种绑定方式:document.getElementById(‘xxx‘).onclick=function(){}document.getElementById("xxx").addEventListener("click",function(){});前者和后者的区别无非就是绑定一个和... 查看详情

node.js自定义对象事件监听与发射

一、Node.js是以事件驱动的,那我们自定义的一些js对象就需要能监听事件以及发射事件。在Node.js中事件使用一个EventEmitter对象发出,该对象在events模块中。它应该是使用观察者设计模式来实现把事件监听器添加到对象以及移除,之... 查看详情

Android:在自定义视图上使用android绑定点击事件

】Android:在自定义视图上使用android绑定点击事件【英文标题】:Android:Useandroidbindingclickeventoncustomview【发布时间】:2019-08-0607:24:36【问题描述】:我创建了自定义视图。我的课程从RelativeLayout扩展而来,在我的课程中我创建了按... 查看详情

Vue.js 自定义事件命名

】Vue.js自定义事件命名【英文标题】:Vue.jscustomeventnaming【发布时间】:2017-07-1511:32:43【问题描述】:我有两个组件,一个包含另一个。当我从孩子触发事件时,我无法在父母那里收到它。子组件this.$emit(\'myCustomEvent\',this.data);父... 查看详情

javascript使用自定义系统属性触发事件(代码片段)

查看详情

自定义 android.app.Application 未触发 onCreate 事件

】自定义android.app.Application未触发onCreate事件【英文标题】:customandroid.app.ApplicationnotfiringonCreateevent【发布时间】:2011-10-1501:10:14【问题描述】:我正在从android.app.Application派生一个自定义应用程序,但我无法触发它的onCreate事件... 查看详情