vue 多点触控手势_移动端手势事件(多指操作)
在移动端开发中,现有的手势事件只有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 多点触控手势_移动端手势事件(多指操作)相关推荐
- vue 多点触控手势_手写 Vue 手势组件__Vue.js
前言 最近需要使用手指捏合扩大的手势操作,找了几个组件,要么对 Vue 适配不好,要么量级太大,决定自己手写手势操作. 项目与效果预览 思路 直接在 DOM 上绑定 touchstart .touch ...
- vue 多点触控手势_涨姿势了!Appium也可以多点触控操作
有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...
- Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...
- Android多点触控详解
本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...
- Windows Phone 7范例游戏Platformer实战5——多点触控编程
即使是再有经验的XNA程序员,在开始Windows Phone 7上的游戏开发时也不得不学习下多点触控这个新的实现方法.虽然目前有些Windows Phone 7手机附带了键盘,但是为了对所有WP7手 ...
- Android_ScaleGestureDetector多点触控
public class ScaleGestureDetector extends Object java.lang.Object android.view.ScaleGestureDetector ...
- PC端chrome浏览器如何调试多点触控事件/chrome浏览器远程调试手机上的网页
PC端chrome浏览器如何调试多点触控事件/chrome浏览器远程调试手机上的网页 最近学习移动端网页开发的时候,遇到了一个问题,如何在真机上看到控制台输出的内容. 虽然现在的桌面浏览器提供了模拟手 ...
- android怎么监听多点触摸_什么是多点触控技术,有哪些用途
自从乔布斯将触控技术用于苹果手机上,很多的手机厂商纷纷效仿,触控技术几乎成为手机的"标配".其实,触控技术早就存在,只是一直未能大面积用于各种设备中,本文将带您认识神奇的触控技术. ...
- Android官方开发文档Training系列课程中文版:手势处理之多点触控处理
原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况.这节课主要学习如何检测多点触控手势. ...
最新文章
- 解题报告:luogu P1688 新单词接龙问题【trie树、dfs、DP递推】
- 浏览器同源策略以及跨域请求时可能遇到的问题
- IP通信基础 5月8日
- ArgoCD + KubeVela:以开发者为中心的 GitOps
- java 事务 数据库 事务_Java数据库编程——事务
- 链接脚本使用----- 将二进制文件作为一个段
- application/x-www-form-urlencoded 与multipart/form-data
- Idea插件——Translation 翻译插件安装与使用
- JVM 堆内存设置原理
- 优化服务器犯法吗,服务器稳定性对于SEO优化有什么影响
- Java基础程序设计的报告
- 第四届泰迪杯数据挖掘挑战赛B题数据预处理-数据导入(Matlab)
- OpenSIPS脚本中的flag
- 双粗虚线中间一条实线_一侧虚线一侧实线可以变道吗?双黄线中间是斜杠
- 矩阵的舒尔补(Schur complement)
- nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
- php 网状结构,数据库模型-数据结构-网状模型
- 冷暖自知——“2016中国创投市场分析报告”解读
- 转折点:移动互联网时代的商业法则
- 【密码学-2】什么是椭圆曲线密码
热门文章
- 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
- System.Net.Mail 简介 收藏
- RADIO控件变量添加
- 使用Rich Edit控件
- null 和{}的那点事
- monaco editor + vue的配置
- 微信支付之JSAPI开发-第二篇:业务流程详解与方案设计
- MySQL 函数积累
- Qt Package Project 打包发布程序
- 2015某大型电商集团的前端实习生在线笔试题(无耻的拿来偷看了)