objects containing Numbers.
* Properties of other types are simply swapped when then Transition
* half-completes. Tweening for custom types is possible, see the
* flare.animate.interpolate.Interpolator class for more.
*
* Starting values are automatically determined from the tweened object.
* Once determined, these starting values are stored to allow both forward
* and backward playback. Use the reset method to force a tween to
* redetermine the starting values the next time it is played. Tweens also
* provide a remove
flag for DisplayObjects. When set to true,
* a display object will be removed from the display list at the end of the
* tween. Note that playing the tween is reverse will not revert this
* removal.
*
* Internally, a Tween creates a set of Interpolator objects to compute
* intermediate values for each property included in values . Note
* that property names can involve nested properties. For example,
* {"filters[0].blurX":5} is a valid tweening property, as both
* array access ([] ) and property access (. ) syntax are
* supported.
*
* To manage a collection of objects being tweened simultaneously, use a
* Transitioner object.
*/
public class Tween extends Transition
{
// -- Properties ------------------------------------------------------
private var _interps:Vector. = new Vector.();
private var _target:Object;
private var _from:Object;
private var _remove:Boolean = false;
private var _visible:Object = null;
private var _values:Object;
/** The target object whose properties are tweened. */
public function get target():Object { return _target; }
public function set target(t:Object):void { _target = t; }
/** Flag indicating if the target object should be removed from the
* display list at the end of the tween. Only applies when the target
* is a DisplayObject
. */
public function get remove():Boolean { return _remove; }
public function set remove(b:Boolean):void { _remove = b; }
/** The properties to tween and their target values. */
public function get values():Object { return _values; }
public function set values(o:Object):void { _values = o; }
/** Optional starting values for tweened properties. */
public function get from():Object { return _from; }
public function set from(s:Object):void { _from = s; }
// - Methods ----------------------------------------------------------
/**
* Creates a new Tween with the specified parameters.
* @param target the target object
* @param duration the duration of the tween, in seconds
* @param values the properties to tween and their target values
* @param remove a display list removal flag (for
* DisplayObject
target objects
* @param easing the easing function to use
*/
public function Tween(target:Object, duration:Number=1,
values:Object=null, remove:Boolean=false, easing:Function=null)
{
super(duration, 0, easing);
_target = target;
_remove = remove;
_values = values==null ? {} : values;
_from = {};
}
/** @inheritDoc */
public override function dispose():void
{
// reclaim any old interpolators
while (_interps.length > 0) {
Interpolator.reclaim(_interps.pop());
}
// remove all target values
for (var name:String in _values) {
delete _values[name];
}
_visible = null;
_remove = false;
_target = null;
}
/**
* Sets up this tween by creating interpolators for each tweened
* property.
*/
protected override function setup():void
{
// reclaim any old interpolators
while (_interps.length > 0) {
Interpolator.reclaim(_interps.pop());
}
// build interpolators
var vc:Object, v0:Object, v1:Object;
for (var name:String in _values) {
// create interpolator only if start/cur/end values don't match
vc = Property.$(name).getValue(_target);
v0 = _from.hasOwnProperty(name) ? _from[name] : vc;
v1 = _values[name];
if (vc != v1 || vc != v0) {
if (name == "visible") {
// special handling for visibility
_visible = Boolean(v1);
} else {
_interps.push(Interpolator.create(_target, name, v0, v1));
}
}
}
}
/**
* Updates target object visibility, if appropriate.
*/
protected override function start():void
{
// set visibility
var item:DisplayObject = _target as DisplayObject;
if (item != null && Boolean(_visible))
item.visible = true;
}
/**
* Steps the tween, updating the tweened properties.
*/
internal override function step(ef:Number):void
{
// run the interpolators
for each (var i:Interpolator in _interps) {
i.interpolate(ef);
}
}
/**
* Ends the tween, updating target object visibility and display
* list membership, if appropriate.
*/
protected override function end():void
{
// set visibility, remove from display list if requested
var item:DisplayObject = _target as DisplayObject;
if (item != null) {
if (_remove && item.parent != null)
item.parent.removeChild(item);
if (_visible != null)
item.visible = Boolean(_visible);
}
}
} // end of class Tween
}