html5手势操作与多指操作封装与Canvas图片裁切实战
当前情况,移动端的开发占比越来越高,单指的拖拽触碰等操作是常规需要。特殊的多指操作与手势操作还需另做处理,而且还涉及到兼容性问题。
// 屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件,安卓不存在需要另外封装
// gesturestart 多指操作触发时
// gesturechange 两根手指发生变化时
// gestureend 两根手指全部抬起时
* 首先是手势操作的参数说明
init:{
el: 要添加事件的元素,
start: 摁下时 要操作的事情(gesturestart),
change: 手指移动时的回调(gesturechange)function(e){
e.scale//在change时,手指之间的距离 和 start时手指之间距离的比值
e.rotation//在change时和start时 手指旋转角度的差值
},
end: 多指触碰结束的回调(gestureend)
}
* 需要用到Math的一个函数: Math.atan2(y, x)
意为:x轴 和 点(x, y)与 (0, 0)连线 逆时针方向形成的夹角
*封装如下:
function gesture(init){
var isGesture = false;
var el = init.el;
var startDis = 0;
var startDeg = 0;
//console.log(getDeg({pageX:0,pageY:0},{pageX:-100,pageY:100}));
el.addEventListener('touchstart', function(e) {
var touch = e.touches;//当前屏幕上的手指列表
if(touch.length >= 2){//当前屏幕有两根以上的手指
isGesture = true;
startDis = getDis(touch[0],touch[1]);//start时两根手指之间的距离
startDeg = getDeg(touch[0],touch[1]);//start时,两根手指形成的直线 和 x轴形成一个逆时针的夹角
init.start&&init.start.call(el,e);
//this.innerHTML = startDis;
}
});
el.addEventListener('touchmove', function(e) {
var touch = e.touches;//当前屏幕上的手指列表
if(touch.length >= 2&&isGesture){//当前屏幕有两根以上的手指
var nowDis = getDis(touch[0],touch[1]);// move时两根手指之间的距离
var nowDeg = getDeg(touch[0],touch[1]);//move时,两根手指形成的直线 和 轴形成一个逆时针的夹角 e.scale = nowDis/startDis;
e.rotation = nowDeg - startDeg;
init.change&&init.change.call(el,e);
}
});
el.addEventListener('touchend', function(e) {
if(isGesture){
init.end&&init.end.call(el,e);
}
isGesture = false;
});
function getDis(point,point2){
var x = point2.pageX - point.pageX;
var y = point2.pageY - point.pageY;
return Math.sqrt(x*x + y*y);
}
function getDeg(point,point2){
var x = point2.pageX - point.pageX;
var y = point2.pageY - point.pageY;
return Math.atan2(y,x)*180/Math.PI;
}
}
缩放卡顿,不流畅的解决方法:
在每次进行手势操作的时候,重新设置缩放值为1
var box = document.querySelector('#box');
var startScale = 1;
css(box,"scale",1);
gesture({
el:box,
start: function(){
startScale = css(box,"scale");
this.style.background = "blue";
},
change: function(e){
// this.innerHTML = "scale:" + e.scale;
// this.innerHTML += "<br/>rotate:" + e.rotation;
css(this,"scale",e.scale*startScale);
},
end: function(){
this.style.background = "red";
}
});
图片裁切实战:
需要用到的知识点:
1. getContext('2d')
获取 canvas 2d画布 上下文
2. canvas drawImg(imgDom, x, y, width, height)
此方法必须等到img加载完成之后使用, 用以在画布上绘制参数对应的图片
3. getImageData(x, y, width, height)
获取参数对应区域的图片信息 (必须在服务器环境下使用,且不能跨域)
4.putimageData(ImageDataObj, x, y)
还有许多可选参数,具体可查阅API
用canvas的以上四个知识点加上封装好的gesture事件就可完成图片裁切功能。
html5手势操作与多指操作封装与Canvas图片裁切实战的更多相关文章
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)
概念: ...
- WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).
WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...
- OpenXml操作Word的一些操作总结.
OpenXml操作Word的一些操作总结. OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩 ...
- Python全栈开发之路 【第十六篇】:jQuey的动画效果、属性操作、文档操作、input的value
01-动画效果 show 显示 概念:显示隐藏的匹配元素 语法:show(speed,callback) 参数: speed:三种预定速度之一的字符串('slow','normal','fast')或 ...
- jQuery二——属性操作、文档操作、位置属性
一.jquery的属性操作 jquery对象有它自己的属性和方法. 其中jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作. 1.html属性操作 是对htm ...
- 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容
孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...
- 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM
前端性能优化--为什么DOM操作慢? 作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...
- python 之 前端开发( jQuery选择器、筛选器、样式操作、文本操作、属性操作、文档操作)
11.5 jQuery 引入方式: 方式一:本地引入 <script src="jquery-3.3.1.min.js"></script> <scr ...
随机推荐
- Confluence 6 关于统一插件管理器
所有的组件通过 统一插件管理器(Universal Plugin Manager)进行管理,这个也被称为 UPM.UPM 可以在几乎所有的 Atlassian 应用中找到,能够提供完整同意的插件安装管 ...
- iis配置问题
最近调试程序时发现一直用的是vs自带的服务器 当我切换成iis时,发现虽然能显示界面,却连不上数据库 (程序数据库的一系列操作是通过wcf ria完成的) 以前在winserver2012上也遇到过这 ...
- day 08字符编码 文件处理
字符编码1.软件启动流程(打开notepad++文档)从硬盘将软件加载到内存上加载test.txt到内存中执行notepad++的代码,将test.txt打到屏幕上 python解释器也是一个应用软件 ...
- PyCharm新建.py文件时自动带出指定内容
如:给Pycharm加上头行 # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...
- 基础运算符补充,流程控制之if判断/while循环
常量 常量即指不变的量.在python中没有一个专门 的语法代表常量,程序员约定俗成地用变量名全部被大写代表常量. AGE_OF_OLDBOY = 56 基础运算符补充 1.算术运算 加减乘除+ - ...
- echarts + timeline 显示多个options
var option = { //timeline基本配置都写在baseoption 中 baseOption: { timeline: { //loop: false, axisType: 'cat ...
- Centos7上实现不同网段的服务器文件共享
目的:实现不同网段的服务器实现文件共享 前提:服务器1可以和共享服务器互通,共享服务器和服务器2互通 拓扑如下: 思路: 一般文件共享有涉及windown系统的用samba,纯类centos系统就用n ...
- Python函数之匿名函数
一:概述 匿名函数主要用来处理比较简单的逻辑,用一行显示,并将运算结果作为返回值返回 二:书写规则 函数名 = lambda 参数:返回值 参数可以有多个,多个参数使用逗号分隔 三 :例子 将func ...
- java 学习中出过的错误
1. 运行异常 C:\Users\plan-B\java>java TapeDeckTestDrive.class 错误: 找不到或无法加载主类 TapeDeckTestDrive.class
- django linux环境部署
一.操作环境: 1操作系统:Ctrip-CentOS-7.1-x86_64-R3 Python版本:2.7.5 Django版本: Django 1.8.19 (LTS) 二.部署流程 pip ins ...