package sk.yoz.ui { import flash.events.EventDispatcher; import flash.events.TouchEvent; import flash.geom.Point; import flash.utils.Dictionary; import sk.yoz.events.MultitouchDragZoomEvent; public class MultitouchDragZoom extends EventDispatcher { protected var dispatchers:Dictionary = new Dictionary(true); public function MultitouchDragZoom() { super(); } public function attach(dispatcher:EventDispatcher):void { var type:String; type = TouchEvent.TOUCH_BEGIN; dispatcher.addEventListener(type, onTouchBegin, false, 0, true); type = TouchEvent.TOUCH_MOVE; dispatcher.addEventListener(type, onTouchMove, false, 0, true); type = TouchEvent.TOUCH_END; dispatcher.addEventListener(type, onTouchEnd, false, 0, true); dispatchers[dispatcher] = {}; } public function detach(dispatcher:EventDispatcher):void { var type:String; type = TouchEvent.TOUCH_BEGIN; dispatcher.removeEventListener(type, onTouchBegin, false); type = TouchEvent.TOUCH_MOVE; dispatcher.removeEventListener(type, onTouchMove, false); type = TouchEvent.TOUCH_END; dispatcher.removeEventListener(type, onTouchEnd, false); delete dispatchers[dispatcher]; } protected function onTouchBegin(event:TouchEvent):void { var data:Object = dispatchers[event.currentTarget]; var key:String = "point" + event.touchPointID; data[key] = event; } protected function onTouchMove(event:TouchEvent):void { if(event.touchPointID > 1) return; var data:Object = dispatchers[event.currentTarget]; if(!data.hasOwnProperty("point0") || !data.hasOwnProperty("point1")) return; var key:String = "point" + event.touchPointID; var last:TouchEvent = TouchEvent(data[key]); var lock:TouchEvent = TouchEvent(data[key == "point0" ? "point1" : "point0"]); var distanceX0:Number = last.stageX - lock.stageX; var distanceY0:Number = last.stageY - lock.stageY; var distanceX1:Number = event.stageX - lock.stageX; var distanceY1:Number = event.stageY - lock.stageY; var scale:Number = Math.sqrt(distanceX1 * distanceX1 + distanceY1 * distanceY1) / Math.sqrt(distanceX0 * distanceX0 + distanceY0 * distanceY0); if(scale == 1 || isNaN(scale) || !isFinite(scale)) return; var change:Number = 1 - scale; if(1 / Math.abs(change) < 2) trace("big", 1 / Math.abs(change)); //trace(event.touchPointID, scale); var rad1:Number = Math.atan2(distanceY0, distanceX0); var rad2:Number = Math.atan2(distanceY1, distanceX1); var rotation:Number = (rad2 - rad1) * 180 / Math.PI; //trace(rotation); var type:String = MultitouchDragZoomEvent.DRAG_ZOOM; var lockPoint:Point = new Point(lock.stageX, lock.stageY); var dragZoomEvent:MultitouchDragZoomEvent = new MultitouchDragZoomEvent(type, lockPoint, scale, rotation); EventDispatcher(event.currentTarget).dispatchEvent(dragZoomEvent); data[key] = event; } protected function onTouchEnd(event:TouchEvent):void { var data:Object = dispatchers[event.currentTarget]; var key:String = "point" + event.touchPointID; delete data[key]; } } }