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