jQuery Multi-TouchWipe / Multi-TouchZoom是小弟参照WipeTouch扩展出来的针对多点触屏划动而改写出来的Jquery插件,可以为dom上的两手指触屏划动拨入(zoomin)或者拨开(zoomout)操作而绑定自己的事件。

// jQuery multitouchzoom 1.0.0
// ------------------------------------------------------------------------
//
// Developed and maintained by Nelson
// Inspired by and referenced from Igor Ramadas's WipeTouch. //
// USAGE
// ------------------------------------------------------------------------
//
// $(selector).multitouchzoom(config);
//
// The multitouchzoom events should expect 2 fingers(a finger and b finger) touch on the screen at the same time;
//
//
// EXAMPLE
// $(document).multitouchzoom({
// zoomIn: function(result) { alert("zoomIn "); },
// zoomOut: function(result) { alert("zoomOut "); }
// });
//
//
// More details at https://github.com/nelsonkuang/MultiTouchZoom
//
//
// The minified version of WipeTouch can be generated using Jasc: http:// (function ($) {
$.fn.multitouchzoom = function (settings) {
// ------------------------------------------------------------------------
// PLUGIN SETTINGS
// ------------------------------------------------------------------------ var config = { // Variables and options
moveX: 40, // minimum amount of horizontal pixels to trigger a wipe event
moveY: 40, // minimum amount of vertical pixels to trigger a wipe event
preventDefault: true, // if true, prevents default events (click for example) // Multi Touch Zoom events
zoomIn: false, // called on zoom in gesture
zoomOut: false, // called on zoom out gesture
multiTouchMove: false, // triggered whenever touchMove acts }; if (settings) {
$.extend(config, settings);
} this.each(function () {
// ------------------------------------------------------------------------
// INTERNAL VARIABLES
// ------------------------------------------------------------------------
var startDate = false; // used to calculate timing and aprox. acceleration
var touchedElement = false; // element which user has touched
var clickEvent = false; // holds the click event of the target, when used hasn't clicked var aStartX; // where finger "a" touch has started, left
var aStartY; // where finger "a" touch has started, top
var aCurX; // keeps finger "a" touch X position while moving on the screen
var aCurY; // keeps finger "a" touch Y position while moving on the screen
var aIsMoving = false; // is user's finger "a" touching and moving? var bStartX; // where finger "b" touch has started, left
var bStartY; // where finger "b" touch has started, top
var bCurX; // keeps finger "b" touch X position while moving on the screen
var bCurY; // keeps finger "b" touch Y position while moving on the screen
var bIsMoving = false; // is user's finger "b" touching and moving? // ------------------------------------------------------------------------
// Multi Touch Eevents
// ------------------------------------------------------------------------ // Called when user multi-touches the screen.
function onMultiTouchStart(e) {
var aStart = e.originalEvent.touches[0] && e.originalEvent.touches.length > 1;
var bStart = e.originalEvent.touches[1];
if (!aIsMoving && !bIsMoving && aStart && bStart) {
if (config.preventDefault) {
e.preventDefault();
} aStartX = e.originalEvent.touches[0].pageX;
aStartY = e.originalEvent.touches[0].pageY;
bStartX = e.originalEvent.touches[1].pageX;
bStartY = e.originalEvent.touches[1].pageY; $(this).bind("touchmove", onMultiTouchMove); // Set the start date and current X/Y for finger "a" & finger "b".
startDate = new Date().getTime();
aCurX = aStartX;
aCurY = aStartY;
bCurX = bStartX;
bCurY = bStartY;
aIsMoving = true;
bIsMoving = true; touchedElement = $(e.target);
}
} // Called when user untouches the screen.
function onTouchEnd(e) {
if (config.preventDefault) {
e.preventDefault();
} // When touch events are not present, use mouse events.
$(this).unbind("touchmove", onMultiTouchMove); // If is moving then calculate the touch results, otherwise reset it.
if (aIsMoving || bIsMoving) {
touchCalculate(e);
}
else {
resetTouch();
}
} // Called when user is touching and moving on the screen.
function onMultiTouchMove(e) {
if (config.preventDefault) {
e.preventDefault();
} if (aIsMoving || bIsMoving) {
aCurX = e.originalEvent.touches[0].pageX;
aCurY = e.originalEvent.touches[0].pageY;
bCurX = e.originalEvent.touches[1].pageX;
bCurY = e.originalEvent.touches[1].pageY;
// If there's a MultiTouchMove event, call it passing
// current X and Y position (curX and curY).
if (config.multiTouchMove) {
triggerEvent(config.multiTouchMove, {
aCurX: aCurX,
aCurY: aCurY,
bCurX: bCurX,
bCurY: bCurY
});
}
}
} // ------------------------------------------------------------------------
// CALCULATE TOUCH AND TRIGGER
// ------------------------------------------------------------------------ function touchCalculate(e) {
var endDate = new Date().getTime(); // current date to calculate timing
var ms = startDate - endDate; // duration of touch in milliseconds var ax = aCurX; // current left position of finger 'a'
var ay = aCurY; // current top position of finger 'a'
var bx = bCurX; // current left position of finger 'b'
var by = bCurY; // current top position of finger 'b'
var dax = ax - aStartX; // diff of current left to starting left of finger 'a'
var day = ay - aStartY; // diff of current top to starting top of finger 'a'
var dbx = bx - bStartX; // diff of current left to starting left of finger 'b'
var dby = by - bStartY; // diff of current top to starting top of finger 'b'
var aax = Math.abs(dax); // amount of horizontal movement of finger 'a'
var aay = Math.abs(day); // amount of vertical movement of finger 'a'
var abx = Math.abs(dbx); // amount of horizontal movement of finger 'b'
var aby = Math.abs(dby); // amount of vertical movement of finger 'b' //diff of current distance to starting distance between the 2 points
var diff = Math.sqrt((aStartX - bStartX) * (aStartX - bStartX) + (aStartY - bStartY) * (aStartY - bStartY)) - Math.sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)); // If moved less than 15 pixels, touch duration is less than 100ms,
// then trigger a click event and stop processing.
if (aax < 15 && aay < 15 && abx < 15 && aby < 15 && ms < 100) {
clickEvent = false; if (config.preventDefault) {
resetTouch(); touchedElement.trigger("click");
return;
}
} // Is it zooming in or out?
var isZoomIn = diff > 0;
var isZoomOut = diff < 0; // Calculate speed from 1 to 5, 1 being slower and 5 faster.
var as = ((aax + aay) * 60) / ((ms) / 6 * (ms));
var bs = ((abx + aby) * 60) / ((ms) / 6 * (ms)); if (as < 1) as = 1;
if (as > 5) as = 5; if (bs < 1) bs = 1;
if (bs > 5) bs = 5; var result = {
aSpeed: parseInt(as),
bSpeed: parseInt(bs),
aX: aax,
aY: aay,
bX: abx,
bY: aby,
source: touchedElement
}; if (aax >= config.moveX || abx >= config.moveX||aay>= config.moveY||aby>=config.moveY) {
// If it is zooming in, trigger zoomIn events.
if (isZoomIn) {
triggerEvent(config.zoomIn, result);
}
// Otherwise trigger zoomOut events.
else if (isZoomOut) {
triggerEvent(config.zoomOut, result);
}
}
resetTouch();
} // Resets the cached variables.
function resetTouch() {
aStartX = false;
aStartY = false;
bStartX = false;
bStartY = false;
startDate = false;
aIsMoving = false;
bIsMoving = false; // If there's a click event, bind after a few miliseconds.
if (clickEvent) {
window.setTimeout(function () {
touchedElement.bind("click", clickEvent);
clickEvent = false;
}, 50);
}
} // Trigger a event passing a result object with
// aSpeed & bSpeed from 1 to 5, aX / aY & bX / bY movement amount in pixels,
// and the source element.
function triggerEvent(zoomEvent, result) {
if (zoomEvent) {
zoomEvent(result);
}
} // ------------------------------------------------------------------------
// ADD MULTITOUCHSTART AND TOUCHEND EVENT LISTENERS
// ------------------------------------------------------------------------ if ("ontouchstart" in document.documentElement) { $(this).bind("touchstart", onMultiTouchStart);
$(this).bind("touchend", onTouchEnd);
}
}); return this;
};
})(jQuery);

jQuery Multi-TouchWipe / Multi-TouchZoom的更多相关文章

  1. How to set an Apache Kafka multi node – multi broker cluster【z】

    Set a multi node Apache ZooKeeper cluster On every node of the cluster add the following lines to th ...

  2. python multi process multi thread

    muti thread: python threading: https://docs.python.org/2/library/threading.html#thread-objects https ...

  3. am335x using brctl iptables dhcpcd make multi wan & multi lan network(十五)

    构建多LAN口多WAN口动态网络 [目的] 在AM335X定制动态网络功能,如下所示,在系统当中有两个以太网口,有4G模块,有wifi芯片8188eu支持AP+STA功能. [实验环境] 1.  Ub ...

  4. redis multi exec

    multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,以后调用的所有方法都会返回相同的对象,直到exec()方法被调用. phpredis是php的 ...

  5. [译]The multi Interface

    The multi Interfacemulti接口 The easy interface as described in detail in this document is a synchrono ...

  6. 科学 multi port

    issues/679 create new UUID cat /proc/sys/kernel/random/uuid example config : multi port , multi user ...

  7. asp.net mvc 2.o 中使用JQuery.uploadify

    From:http://www.cnblogs.com/strugglesMen/archive/2011/07/01/2095916.html 官方网站http://www.uploadify.co ...

  8. jquery uploadify修改上传的文件名和显示

    如果觉得看文章太麻烦,可以直接看参考:http://stackoverflow.com/questions/7707687/jquery-uploadify-change-file-name-as-i ...

  9. widget jquery 理解

    jquery ui 的所有组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,实用它能实现一致的API,创建有状态的插件,而无需关心插件的内部转换. $.wi ...

  10. jquery ui widget 源代码分析

    jquery ui 的全部组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,有用它能实现一致的API.创建有状态的插件,而无需关心插件的内部转换. $.wi ...

随机推荐

  1. 使用a标签删除进行提示

    一句话搞定: <a href="Login.aspx" target="mainFrame" class="STYLE4" oncli ...

  2. in addition to 和 except for

    except for 除了...以外(与 except for 连用的整体词与 except for 所跟的词往往不是同类的,是指整体中除去 一个细节.) eg:Your composition is ...

  3. Redis事件管理(一)

    Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...

  4. Html和CSS的关系

    1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 2. CSS样式是表现.就像网页的外衣.比如,标题字体.颜色变化,或为标题加入背景图片. ...

  5. 浅谈 switch和if

    1.所有的switch 都可以用if 替换,但所有的if不一定能被switch替换 2.:switch case直接跳到对应的case值里面执行相应代码.而if语句会执行一条一条判断语句,直到匹配到对 ...

  6. C#接扣和抽象类

    什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,CLR允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及常数.但是 ...

  7. 【jquery】 【jQuery技术内幕】阅读笔记 一

    jQuery( object ) jquery在构造对象时,除了可以用十分好用的css选择器来查找DOM,还可以传入一个javascript对象来生成一个jquery对象. // JS var foo ...

  8. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  9. Jmeter在restful风格接口测试中的应用

    1.如何下载安装 官网下载,一个压缩包apache-jmeter-3.0.zip,解压即可,打开bin目录下jmeter.bat即可打开软件. 2.熟悉界面 3.实际案例 测试restful风格接口 ...

  10. Microsoft SQL Server 博客目录

    基础概念篇 SQL Server排序规则 SQL SERVER 统计信息概述(Statistics) SQL SERVER 索引之聚集索引和非聚集索引的描述 Sql Server 索引之唯一索引和筛选 ...