在移动端开发中,现有的手势事件只有IOS上的浏览器支持,因此对其他设备上的浏览器手势事件我们必须在移动端的touchstart、toucmove、touchend事件上进行改造升级,下面就介绍下升级改造的移动端的手势事件。

移动端触摸事件(基础事件)

touchstart— 触摸开始

touchmove— 触摸移动

touchend— 触摸结束

touchcancel— 触摸中断(在触摸过程中被打断,如弹框)

box.addEventListener('touchmove',function (event) {

console.log('触摸移动');

}

touchEvent对象

touches—触发事件时屏幕上的触点个数

targetTouches—触发事件时事件元素上的触点个数

changedTouches—触发事件发生改变的触点个数

target —事件元素

stopPropagation() —阻止事件冒泡

preventDefault() —阻止默认行为

touchlist对象

touchEvent对象的集合,类数组对象;

targetTouches、touches、changedTouches属性返回的都是touchlist对象

touch对象

clientX/clientY—触点在视口上的位置

pageX/pageY—触点在页面上的位置

screenX/screenY—触点在屏幕上的位置

box.addEventListener('touchstart',function (event) {

console.log(event.touches); //一个手指触摸时输出 Touchlist{0:Touch,length:1}

var startX = event.touches[0].clientX; //触点在视口上的位置

}

手势事件

IOS的手势事件

1.1 事件

gesturestart—手势开始,手指触碰当前元素,屏幕上有两个或者两个以上的手指

gesturechange—手势变化,手指触碰当前元素,屏幕上有两个或者两个以上的手指位置在发生移动

gestureend—手势结束,在gesturestart后, 屏幕上只剩下两根以下(不包括两根)的手指

1.2 touchEvent 新增的属性

scale 触点的距离与触点初始距离的比例

rotation 触点的角度差与初始角度差的差

box.addEventListener('gesturechange', function(event){

box.innerHTML = 'rotation : '+event.rotation + '
';

box.innerHTML += 'scale : '+event.scale + '
';

});

移动端手势事件(多指事件)

//封装 gestrue.js插件

(function (w) {

/**

* 用于给元素监听手势事件

* @param node 要监听的元素

* @param callback 对象,对象有三个函数 start、change、end

*/

function gesture(node, callback) {

//手势开始

// 当开始触摸元素的时候,判断屏幕上手指个数 >= 2

node.addEventListener('touchstart', function(event) {

if (event.touches.length >= 2) {

//标记已经触发了手势开始

node.isGestureStart = true;

//计算一下两个触点的初始距离

this.startDst = getDst(event.touches[0], event.touches[1]);

//计算一下两个触点的初始角度

this.startDeg = getDeg(event.touches[0], event.touches[1]);

// 调用回调函数

if (callback && typeof(callback['start']) === 'function') {

callback['start']();

}

}

});

// 手势移动

// 当有手指移动的时候,判断屏幕上手指的个数 >= 2

node.addEventListener('touchmove', function(event) {

if (event.touches.length >= 2) {

// 计算当前两个触点的距离

var currentDst = getDst(event.touches[0], event.touches[1]);

// 计算书两个触点的当前的夹角角度

var currentDeg = getDeg(event.touches[0], event.touches[1]);

// 计算当前两个触点的距离 和 两个触点的初始距离 比例

event.scale = currentDst / this.startDst;

// 计算两个触点,夹角的变化

event.rotation = currentDeg - this.startDeg;

//调用回调函数

if (callback && typeof(callback['change']) === 'function') {

callback['change'](event);

}

}

});

// 手势结束

// 触发过手势开始并且有触摸结束的时候判断屏幕上手指数量 < 2

node.addEventListener('touchend', function(event) {

if (node.isGestureStart && event.touches.length < 2) {

//重置标记

node.isGestureStart = false;

//调用回调函数

if (callback && typeof(callback['end']) === 'function') {

callback['end']();

}

}

});

/**

* 计算两个触点的位置

* @param touch1 第一个触点

* @param touch2 第二个触点

*/

function getDst(touch1, touch2) {

//计算两个直角边的长度

var x = touch2.clientX - touch1.clientX; //水平方向的距离

var y = touch2.clientY - touch1.clientY; //垂直方向的距离

//利用勾股定理,计算两个触点的距离(斜边的长度)

var z = Math.sqrt(x*x + y*y);

// 返回结果

return z;

}

/**

* 计算两个触点的夹角(水平辅助线)的角度

* @param touch1 第一个触点

* @param touch2 第二个触点

*/

function getDeg(touch1, touch2) {

//计算两个触点的距离,两个直角边长度

var x = touch2.clientX - touch1.clientX; //临边

var y = touch2.clientY - touch1.clientY; //对边

//根据两个直角边比例 tan,计算角度

var angle = Math.atan2(y, x); //是个弧度

//根据弧度计算角度

var deg = angle / Math.PI * 180;

//返回角度

return deg;

}

}

//暴露

w.gesture = gesture;

})(window);

使用案例-实现元素缩放及旋转

元素缩放及旋转

* {

margin:0;

padding:0;

}

html,body,#app {

width: 100%;

height: 100%;

overflow: hidden;

}

#box {

position: absolute;

left: 0;

top: 0;

right: 0;

bottom: 0;

margin: auto;

width: 150px;

height: 150px;

background-color: #f90;

}

**transformcss.js代码可查看笔者的'transform函数'文章**

(function () {

//获取元素

var app = document.querySelector('#app');

var box = document.querySelector('#box');

//阻止浏览器默认行为

app.addEventListener('touchstart', function(event) {

event.preventDefault();

});

gesture(box, {

start: function(){

//记录开始手势的时候,此时元素的缩放比例

box.startScale = transformCss(box, 'scale'); //默认为1

//计算开始手势的时候,此时元素的初始旋转角度

box.startRotate = transformCss(box, 'rotate'); //默认为0

},

change: function(event){

//实现缩放

transformCss(box, 'scale', box.startScale * event.scale);

//实现旋转

transformCss(box, 'rotate', box.startRotate + event.rotation)

}

});

})();

说明:笔者只是个在前端道路上默默摸索的初学者,若本文涉及错误请及时给予纠正,如果本文对您有帮助的话,点击铭哥哥网址 http://learn.fuming.site/ 学习更多!

作者:捕猹少年闰土

vue 多点触控手势_移动端手势事件(多指操作)相关推荐

  1. vue 多点触控手势_手写 Vue 手势组件__Vue.js

    前言 最近需要使用手指捏合扩大的手势操作,找了几个组件,要么对 Vue 适配不好,要么量级太大,决定自己手写手势操作. 项目与效果预览 思路 直接在 DOM 上绑定 touchstart .touch ...

  2. vue 多点触控手势_涨姿势了!Appium也可以多点触控操作

    有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...

  3. Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...

  4. Android多点触控详解

    本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...

  5. Windows Phone 7范例游戏Platformer实战5——多点触控编程

    即使是再有经验的XNA程序员,在开始Windows Phone 7上的游戏开发时也不得不学习下多点触控这个新的实现方法.虽然目前有些Windows Phone 7手机附带了键盘,但是为了对所有WP7手 ...

  6. Android_ScaleGestureDetector多点触控

    public class ScaleGestureDetector extends Object java.lang.Object android.view.ScaleGestureDetector ...

  7. PC端chrome浏览器如何调试多点触控事件/chrome浏览器远程调试手机上的网页

    PC端chrome浏览器如何调试多点触控事件/chrome浏览器远程调试手机上的网页 最近学习移动端网页开发的时候,遇到了一个问题,如何在真机上看到控制台输出的内容. 虽然现在的桌面浏览器提供了模拟手 ...

  8. android怎么监听多点触摸_什么是多点触控技术,有哪些用途

    自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...

  9. Android官方开发文档Training系列课程中文版:手势处理之多点触控处理

    原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况.这节课主要学习如何检测多点触控手势. ...

最新文章

  1. 解题报告:luogu P1688 新单词接龙问题【trie树、dfs、DP递推】
  2. 浏览器同源策略以及跨域请求时可能遇到的问题
  3. IP通信基础 5月8日
  4. ArgoCD + KubeVela:以开发者为中心的 GitOps
  5. java 事务 数据库 事务_Java数据库编程——事务
  6. 链接脚本使用----- 将二进制文件作为一个段
  7. application/x-www-form-urlencoded 与multipart/form-data
  8. Idea插件——Translation 翻译插件安装与使用
  9. JVM 堆内存设置原理
  10. 优化服务器犯法吗,服务器稳定性对于SEO优化有什么影响
  11. Java基础程序设计的报告
  12. 第四届泰迪杯数据挖掘挑战赛B题数据预处理-数据导入(Matlab)
  13. OpenSIPS脚本中的flag
  14. 双粗虚线中间一条实线_一侧虚线一侧实线可以变道吗?双黄线中间是斜杠
  15. 矩阵的舒尔补(Schur complement)
  16. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
  17. php 网状结构,数据库模型-数据结构-网状模型
  18. 冷暖自知——“2016中国创投市场分析报告”解读
  19. 转折点:移动互联网时代的商业法则
  20. 【密码学-2】什么是椭圆曲线密码

热门文章

  1. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
  2. System.Net.Mail 简介 收藏
  3. RADIO控件变量添加
  4. 使用Rich Edit控件
  5. null 和{}的那点事
  6. monaco editor + vue的配置
  7. 微信支付之JSAPI开发-第二篇:业务流程详解与方案设计
  8. MySQL 函数积累
  9. Qt Package Project 打包发布程序
  10. 2015某大型电商集团的前端实习生在线笔试题(无耻的拿来偷看了)