Ext.gesture.Pinch = Ext.extend(Ext.gesture.Gesture, { handles: [ 'pinchstart', 'pinch', 'pinchend' ], touches: 2, onTouchStart : function(e) { var me = this; if (Ext.supports.Touch && e.targetTouches.length >= 2) { me.lock('swipe', 'scroll', 'scrollstart', 'scrollend', 'touchmove', 'touchend', 'touchstart', 'tap', 'tapstart', 'taphold', 'tapcancel', 'doubletap'); me.pinching = true; var targetTouches = e.targetTouches, firstTouch = me.firstTouch = targetTouches[0], secondTouch = me.secondTouch = targetTouches[1]; me.previousDistance = me.startDistance = me.getDistance(); me.previousScale = 1; me.fire('pinchstart', e, { distance: me.startDistance, scale: me.previousScale }); } else if (me.pinching) { me.unlock('swipe', 'scroll', 'scrollstart', 'scrollend', 'touchmove', 'touchend', 'touchstart', 'tap', 'tapstart', 'taphold', 'tapcancel', 'doubletap'); me.pinching = false; } }, onTouchMove : function(e) { if (this.pinching) { this.fire('pinch', e, this.getPinchInfo()); } }, onTouchEnd : function(e) { if (this.pinching) { this.fire('pinchend', e, this.getPinchInfo()); } }, getPinchInfo : function() { var me = this, distance = me.getDistance(), scale = distance / me.startDistance, firstTouch = me.firstTouch, secondTouch = me.secondTouch, info = { scale: scale, deltaScale: scale - 1, previousScale: me.previousScale, previousDeltaScale: scale - me.previousScale, distance: distance, deltaDistance: distance - me.startDistance, startDistance: me.startDistance, previousDistance: me.previousDistance, previousDeltaDistance: distance - me.previousDistance, firstTouch: firstTouch, secondTouch: secondTouch, firstPageX: firstTouch.pageX, firstPageY: firstTouch.pageY, secondPageX: secondTouch.pageX, secondPageY: secondTouch.pageY, // The midpoint between the touches is (x1 + x2) / 2, (y1 + y2) / 2 midPointX: (firstTouch.pageX + secondTouch.pageX) / 2, midPointY: (firstTouch.pageY + secondTouch.pageY) / 2 }; me.previousScale = scale; me.previousDistance = distance; return info; }, getDistance : function() { var me = this; return Math.sqrt( Math.pow(Math.abs(me.firstTouch.pageX - me.secondTouch.pageX), 2) + Math.pow(Math.abs(me.firstTouch.pageY - me.secondTouch.pageY), 2) ); } }); Ext.regGesture('pinch', Ext.gesture.Pinch);