Touch properties updates (and corresponding gestures fixes)

This commit is contained in:
Pavel fljot 2012-03-02 20:33:16 +02:00
parent b56107e059
commit 4d5bef0252
9 changed files with 114 additions and 133 deletions

View file

@ -1,6 +1,7 @@
package org.gestouch.core
{
import flash.display.InteractiveObject;
import flash.geom.Point;
/**
@ -20,18 +21,11 @@ package org.gestouch.core
*/
public var target:InteractiveObject;
public var x:Number;
public var y:Number;
public var sizeX:Number;
public var sizeY:Number;
public var pressure:Number;
public var time:uint;
// public var touchBeginPos:Point;
// public var touchBeginTime:uint;
// public var moveOffset:Point;
// public var lastMove:Point;
// public var velocity:Point;
public function Touch(id:uint = 0)
@ -40,16 +34,76 @@ package org.gestouch.core
}
protected var _location:Point;
public function get location():Point
{
return _location.clone();
}
gestouch_internal function setLocation(value:Point):void
{
_location = value;
_beginLocation = _location.clone();
}
gestouch_internal function updateLocation(x:Number, y:Number):void
{
if (_location)
{
_location.x = x;
_location.y = y;
}
else
{
gestouch_internal::setLocation(new Point(x, y));
}
}
protected var _beginLocation:Point;
public function get beginLocation():Point
{
return _beginLocation.clone();
}
public function get locationOffset():Point
{
return _location.subtract(_beginLocation);
}
protected var _time:uint;
public function get time():uint
{
return _time;
}
gestouch_internal function setTime(value:uint):void
{
_time = value;
}
protected var _beginTime:uint;
public function get beginTime():uint
{
return _beginTime;
}
gestouch_internal function setBeginTime(value:uint):void
{
_beginTime = value;
}
public function clone():Touch
{
var touch:Touch = new Touch(id);
touch.x = x;
touch.y = y;
touch._location = _location;
touch._beginLocation = _beginLocation;
touch.target = target;
touch.sizeX = sizeX;
touch.sizeY = sizeY;
touch.pressure = pressure;
touch.time = time;
touch._time = _time;
touch._beginTime = _beginTime;
return touch;
}
@ -57,7 +111,7 @@ package org.gestouch.core
public function toString():String
{
return "Touch [id: " + id + ", x: " + x + ", y: " + y + ", ...]";
return "Touch [id: " + id + ", location: " + location + ", ...]";
}
}
}

View file

@ -359,14 +359,14 @@ package org.gestouch.gestures
protected function updateCentralPoint():void
{
var touch:Touch;
var touchLocation:Point;
var x:Number = 0;
var y:Number = 0;
for (var touchID:String in _touchesMap)
{
touch = _touchesMap[int(touchID)] as Touch;
x += touch.x;
y += touch.y;
touchLocation = (_touchesMap[int(touchID)] as Touch).location;
x += touchLocation.x;
y += touchLocation.y;
}
_centralPoint.x = x / _touchesCount;
_centralPoint.y = y / _touchesCount;

View file

@ -28,8 +28,6 @@ package org.gestouch.gestures
public var slop:Number = Gesture.DEFAULT_SLOP;
protected var _timer:Timer;
protected var _touchBeginX:Array = [];
protected var _touchBeginY:Array = [];
protected var _numTouchesRequiredReached:Boolean;
@ -57,8 +55,6 @@ package org.gestouch.gestures
{
super.reset();
_touchBeginX.length = 0;
_touchBeginY.length = 0;
_numTouchesRequiredReached = false;
_timer.reset();
}
@ -96,9 +92,6 @@ package org.gestouch.gestures
return;
}
_touchBeginX[touch.id] = touch.x;
_touchBeginY[touch.id] = touch.y;
if (touchesCount == numTouchesRequired)
{
_numTouchesRequiredReached = true;
@ -120,10 +113,7 @@ package org.gestouch.gestures
{
if (state == GestureState.POSSIBLE && slop > 0)
{
// Fail if touch overcome slop distance
var dx:Number = Number(_touchBeginX[touch.id]) - touch.x;
var dy:Number = Number(_touchBeginY[touch.id]) - touch.y;
if (Math.sqrt(dx*dx + dy*dy) > slop)
if (touch.locationOffset.length > slop)
{
setState(GestureState.FAILED);
return;

View file

@ -24,9 +24,6 @@ package org.gestouch.gestures
*/
public var direction:uint = PanGestureDirection.NO_DIRECTION;
protected var _touchBeginX:Array = [];
protected var _touchBeginY:Array = [];
public function PanGesture(target:InteractiveObject = null)
{
@ -91,15 +88,6 @@ package org.gestouch.gestures
return PanGesture;
}
override public function reset():void
{
_touchBeginX.length = 0;
_touchBeginY.length = 0;
super.reset();
}
@ -118,9 +106,6 @@ package org.gestouch.gestures
return;
}
_touchBeginX[touch.id] = touch.x;
_touchBeginY[touch.id] = touch.y;
if (touchesCount >= minNumTouchesRequired)
{
updateLocation();
@ -141,9 +126,17 @@ package org.gestouch.gestures
if (state == GestureState.POSSIBLE)
{
// Check if finger moved enough for gesture to be recognized
var dx:Number = (direction == PanGestureDirection.VERTICAL) ? 0 : Number(_touchBeginX[touch.id]) - touch.x;
var dy:Number = (direction == PanGestureDirection.HORIZONTAL) ? 0 : Number(_touchBeginY[touch.id]) - touch.y;
if (Math.sqrt(dx*dx + dy*dy) > slop || slop != slop)//faster isNaN(slop)
var locationOffset:Point = touch.locationOffset;
if (direction == PanGestureDirection.VERTICAL)
{
locationOffset.x = 0;
}
else if (direction == PanGestureDirection.HORIZONTAL)
{
locationOffset.y = 0;
}
if (locationOffset.length > slop || slop != slop)//faster isNaN(slop)
{
prevLocationX = _location.x;
prevLocationY = _location.y;

View file

@ -21,8 +21,6 @@ package org.gestouch.gestures
{
public var slop:Number = Gesture.DEFAULT_SLOP >> 1;
protected var _touchBeginX:Array = [];
protected var _touchBeginY:Array = [];
protected var _rotationVector:Point = new Point();
protected var _firstTouch:Touch;
protected var _secondTouch:Touch;
@ -47,15 +45,6 @@ package org.gestouch.gestures
return RotateGesture;
}
override public function reset():void
{
_touchBeginX.length = 0;
_touchBeginY.length = 0;
super.reset();
}
@ -82,13 +71,7 @@ package org.gestouch.gestures
{
_secondTouch = touch;
_touchBeginX[_firstTouch.id] = _firstTouch.x;
_touchBeginY[_firstTouch.id] = _firstTouch.y;
_touchBeginX[_secondTouch.id] = _secondTouch.x;
_touchBeginY[_secondTouch.id] = _secondTouch.y;
_rotationVector.x = _secondTouch.x - _firstTouch.x;
_rotationVector.y = _secondTouch.y - _firstTouch.y;
_rotationVector = _secondTouch.location.subtract(_firstTouch.location);
}
}
@ -106,19 +89,14 @@ package org.gestouch.gestures
if (touchesCount == 2)
{
var currRotationVector:Point = new Point(_secondTouch.x - _firstTouch.x, _secondTouch.y - _firstTouch.y);
var recognized:Boolean;
if (state == GestureState.POSSIBLE)
{
// we start once any finger moved enough
var dx:Number = Number(_touchBeginX[touch.id]) - touch.x;
var dy:Number = Number(_touchBeginY[touch.id]) - touch.y;
if (Math.sqrt(dx*dx + dy*dy) > slop || slop != slop)//faster isNaN(slop)
if (touch.locationOffset.length > slop || slop != slop)//faster isNaN(slop)
{
recognized = true;
_rotationVector.x = _secondTouch.x - _firstTouch.x;
_rotationVector.y = _secondTouch.y - _firstTouch.y;
}
}
else
@ -128,13 +106,14 @@ package org.gestouch.gestures
if (recognized)
{
updateLocation();
var currRotationVector:Point = _secondTouch.location.subtract(_firstTouch.location);
var rotation:Number = Math.atan2(currRotationVector.y, currRotationVector.x) - Math.atan2(_rotationVector.y, _rotationVector.x);
rotation *= GestureUtils.RADIANS_TO_DEGREES;
_rotationVector.x = currRotationVector.x;
_rotationVector.y = currRotationVector.y;
updateLocation();
if (state == GestureState.POSSIBLE)
{
if (setState(GestureState.BEGAN) && hasEventListener(RotateGestureEvent.GESTURE_ROTATE))

View file

@ -24,8 +24,6 @@ package org.gestouch.gestures
public var maxTapDuration:uint = 1500;
protected var _timer:Timer;
protected var _touchBeginX:Array = [];
protected var _touchBeginY:Array = [];
protected var _numTouchesRequiredReached:Boolean;
protected var _tapCounter:uint = 0;
@ -51,9 +49,7 @@ package org.gestouch.gestures
override public function reset():void
{
_touchBeginX.length = 0;
_touchBeginY.length = 0;
{
_numTouchesRequiredReached = false;
_tapCounter = 0;
_timer.reset();
@ -100,9 +96,6 @@ package org.gestouch.gestures
return;
}
_touchBeginX[touch.id] = touch.x;
_touchBeginY[touch.id] = touch.y;
if (touchesCount == 1)
{
_timer.reset();
@ -119,15 +112,9 @@ package org.gestouch.gestures
override protected function onTouchMove(touch:Touch):void
{
if (slop >= 0)
if (slop >= 0 && touch.locationOffset.length > slop)
{
// Fail if touch overcome slop distance
var dx:Number = Number(_touchBeginX[touch.id]) - touch.x;
var dy:Number = Number(_touchBeginY[touch.id]) - touch.y;
if (Math.sqrt(dx*dx + dy*dy) > slop)
{
setState(GestureState.FAILED);
}
setState(GestureState.FAILED);
}
}

View file

@ -21,8 +21,6 @@ package org.gestouch.gestures
public var slop:Number = Gesture.DEFAULT_SLOP >> 1;
public var lockAspectRatio:Boolean = true;
protected var _touchBeginX:Array = [];
protected var _touchBeginY:Array = [];
protected var _scaleVector:Point = new Point();
protected var _firstTouch:Touch;
protected var _secondTouch:Touch;
@ -47,15 +45,6 @@ package org.gestouch.gestures
return ZoomGesture;
}
override public function reset():void
{
_touchBeginX.length = 0;
_touchBeginY.length = 0;
super.reset();
}
@ -82,13 +71,7 @@ package org.gestouch.gestures
{
_secondTouch = touch;
_touchBeginX[_firstTouch.id] = _firstTouch.x;
_touchBeginY[_firstTouch.id] = _firstTouch.y;
_touchBeginX[_secondTouch.id] = _secondTouch.x;
_touchBeginY[_secondTouch.id] = _secondTouch.y;
_scaleVector.x = _secondTouch.x - _firstTouch.x;
_scaleVector.y = _secondTouch.y - _firstTouch.y;
_scaleVector = _secondTouch.location.subtract(_firstTouch.location);
}
}
@ -106,19 +89,14 @@ package org.gestouch.gestures
if (touchesCount == 2)
{
var currScaleVector:Point = new Point(_secondTouch.x - _firstTouch.x, _secondTouch.y - _firstTouch.y);
var recognized:Boolean;
if (state == GestureState.POSSIBLE)
{
// Check if finger moved enough for gesture to be recognized
var dx:Number = Number(_touchBeginX[touch.id]) - touch.x;
var dy:Number = Number(_touchBeginY[touch.id]) - touch.y;
if (Math.sqrt(dx*dx + dy*dy) > slop || slop != slop)//faster isNaN(slop)
if (touch.locationOffset.length > slop || slop != slop)//faster isNaN(slop)
{
recognized = true;
_scaleVector.x = _secondTouch.x - _firstTouch.x;
_scaleVector.y = _secondTouch.y - _firstTouch.y;
}
}
else
@ -128,8 +106,7 @@ package org.gestouch.gestures
if (recognized)
{
updateLocation();
var currScaleVector:Point = _secondTouch.location.subtract(_firstTouch.location);
var scaleX:Number;
var scaleY:Number;
if (lockAspectRatio)
@ -145,6 +122,8 @@ package org.gestouch.gestures
_scaleVector.x = currScaleVector.x;
_scaleVector.y = currScaleVector.y;
updateLocation();
if (state == GestureState.POSSIBLE)
{
if (setState(GestureState.BEGAN) && hasEventListener(ZoomGestureEvent.GESTURE_ZOOM))

View file

@ -7,6 +7,7 @@ package org.gestouch.input
import flash.display.Stage;
import flash.events.EventPhase;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.utils.getTimer;
@ -78,9 +79,9 @@ package org.gestouch.input
var touch:Touch = _touchesManager.createTouch();
touch.id = 0;
touch.target = event.target as InteractiveObject;
touch.x = event.stageX;
touch.y = event.stageY;
touch.time = getTimer();
touch.gestouch_internal::setLocation(new Point(event.stageX, event.stageY));
touch.gestouch_internal::setTime(getTimer());
touch.gestouch_internal::setBeginTime(getTimer());
_touchesManager.addTouch(touch);
@ -96,9 +97,8 @@ package org.gestouch.input
return;
var touch:Touch = _touchesManager.getTouch(PRIMARY_TOUCH_POINT_ID);
touch.x = event.stageX;
touch.y = event.stageY;
touch.time = getTimer();
touch.gestouch_internal::updateLocation(event.stageX, event.stageY);
touch.gestouch_internal::setTime(getTimer());
_gesturesManager.gestouch_internal::onTouchMove(touch);
}
@ -117,9 +117,8 @@ package org.gestouch.input
return;
var touch:Touch = _touchesManager.getTouch(PRIMARY_TOUCH_POINT_ID);
touch.x = event.stageX;
touch.y = event.stageY;
touch.time = getTimer();
touch.gestouch_internal::updateLocation(event.stageX, event.stageY);
touch.gestouch_internal::setTime(getTimer());
_gesturesManager.gestouch_internal::onTouchEnd(touch);

View file

@ -7,6 +7,7 @@ package org.gestouch.input
import flash.display.Stage;
import flash.events.EventPhase;
import flash.events.TouchEvent;
import flash.geom.Point;
import flash.utils.getTimer;
@ -81,19 +82,20 @@ package org.gestouch.input
var touch:Touch = _touchesManager.createTouch();
touch.id = event.touchPointID;
touch.target = event.target as InteractiveObject;
touch.x = event.stageX;
touch.y = event.stageY;
touch.gestouch_internal::setLocation(new Point(event.stageX, event.stageY));
touch.sizeX = event.sizeX;
touch.sizeY = event.sizeY;
touch.pressure = event.pressure;
//TODO: conditional compilation?
if (event.hasOwnProperty("timestamp"))
{
touch.time = event["timestamp"];
touch.gestouch_internal::setTime(event["timestamp"]);
touch.gestouch_internal::setBeginTime(event["timestamp"]);
}
else
{
touch.time = getTimer();
touch.gestouch_internal::setTime(getTimer());
touch.gestouch_internal::setBeginTime(getTimer());
}
_touchesManager.addTouch(touch);
@ -111,19 +113,18 @@ package org.gestouch.input
return;
var touch:Touch = _touchesManager.getTouch(event.touchPointID);
touch.x = event.stageX;
touch.y = event.stageY;
touch.gestouch_internal::updateLocation(event.stageX, event.stageY);
touch.sizeX = event.sizeX;
touch.sizeY = event.sizeY;
touch.pressure = event.pressure;
//TODO: conditional compilation?
if (event.hasOwnProperty("timestamp"))
{
touch.time = event["timestamp"];
touch.gestouch_internal::setTime(event["timestamp"]);
}
else
{
touch.time = getTimer();
touch.gestouch_internal::setTime(getTimer());
}
_gesturesManager.gestouch_internal::onTouchMove(touch);
@ -142,19 +143,18 @@ package org.gestouch.input
return;
var touch:Touch = _touchesManager.getTouch(event.touchPointID);
touch.x = event.stageX;
touch.y = event.stageY;
touch.gestouch_internal::updateLocation(event.stageX, event.stageY);
touch.sizeX = event.sizeX;
touch.sizeY = event.sizeY;
touch.pressure = event.pressure;
//TODO: conditional compilation?
if (event.hasOwnProperty("timestamp"))
{
touch.time = event["timestamp"];
touch.gestouch_internal::setTime(event["timestamp"]);
}
else
{
touch.time = getTimer();
touch.gestouch_internal::setTime(getTimer());
}
_gesturesManager.gestouch_internal::onTouchEnd(touch);