classes

MultitouchDragZoom.as

Stiahnuť MultitouchDragZoom.as

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];
        }
    }
}