blob: 4bd4ed0e3f8d1d6497516718b4675b15db6563d1 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package mx.effects
{
import flash.events.EventDispatcher;
import mx.core.mx_internal;
import mx.effects.effectClasses.MaskEffectInstance;
import mx.events.TweenEvent;
use namespace mx_internal;
/**
* Dispatched when the effect starts, which corresponds to the
* first call to the <code>onMoveTweenUpdate()</code>
* and <code>onScaleTweenUpdate()</code> methods.
* Flex also dispatches the first <code>tweenUpdate</code> event
* for the effect at the same time.
*
* <p>The <code>Effect.effectStart</code> event is dispatched
* before the <code>tweenStart</code> event.</p>
*
* @eventType mx.events.TweenEvent.TWEEN_START
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="tweenStart", type="mx.events.TweenEvent")]
/**
* Dispatched every time the effect updates the target.
* The dispatching of this event corresponds to the
* calls to the <code>onMoveTweenUpdate()</code>
* and <code>onScaleTweenUpdate()</code> methods.
*
* @eventType mx.events.TweenEvent.TWEEN_UPDATE
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="tweenUpdate", type="mx.events.TweenEvent")]
/**
* Dispatched when the effect ends.
*
* <p>When an effect plays a single time, this event occurs
* at the same time as an <code>effectEnd</code> event.
* If you configure the effect to repeat,
* it occurs at the end of every repetition of the effect,
* and the <code>endEffect</code> event occurs
* after the effect plays for the final time.</p>
*
* @eventType mx.events.TweenEvent.TWEEN_END
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
[Event(name="tweenEnd", type="mx.events.TweenEvent")]
/**
* The MaskEffect class is an abstract base class for all effects
* that animate a mask, such as the wipe effects and the Iris effect.
* This class encapsulates methods and properties that are common
* among all mask-based effects.
*
* <p>A mask effect uses an overlay, called a mask, to perform the effect.
* By default, the mask is a rectangle with the same size
* as the target component. </p>
*
* <p>The before or after state of the target component of a mask effect
* must be invisible.
* That means a mask effect always makes a target component appear on
* the screen, or disappear from the screen.</p>
*
* <p>You use the <code>scaleXFrom</code>, <code>scaleYFrom</code>,
* <code>scaleXTo</code>, and <code>scaleX</code> properties to specify
* the initial and final scale of the mask, where a value of 1.0 corresponds
* to scaling the mask to the size of the target component, 2.0 scales
* the mask to twice the size of the component, 0.5 scales the mask to half
* the size of the component, and so on.
* To use any one of these properties, you must specify all four.</p>
*
* <p>You use the <code>xFrom</code>, <code>yFrom</code>, <code>xTo</code>,
* and <code>yTo</code> properties to specify the coordinates of the initial
* position and final position of the mask relative to the target component,
* where (0, 0) corresponds to the upper left corner of the target.
* To use any one of these properties, you must specify all four.</p>
*
* <p>The coordinates of the initial and final position of the mask
* depend on the type of effect and whether the <code>show</code> property
* is <code>true</code> or <code>false</code>.
* For example, for the WipeLeft effect with a <code>show</code> value of
* <code>false</code>, the coordinates of the initial mask position
* are (0, 0),corresponding to the upper-left corner of the target,
* and the coordinates of the final position are the upper-right corner
* of the target (width, 0), where width is the width of the target.</p>
*
* <p>For a <code>show</code> value of <code>true</code> for the WipeLeft
* effect, the coordinates of the initial mask position are (width, 0),
* and the coordinates of the final position are (0, 0).</p>
*
* @mxml
*
* <p>The MaskEffect class defines the following properties,
* which all of its subclasses inherit:</p>
*
* <pre>
* &lt;mx:<i>tagname</i>
* createMaskFunction=""
* moveEasingFunction=""
* scaleEasingFunction=""
* scaleXFrom=""
* scaleXTo=""
* scaleYFrom=""
* scaleYTo=""
* show="true|false"
* xFrom=""
* xTo=""
* yFrom=""
* yTo=""
* /&gt;
* </pre>
*
* @see mx.effects.effectClasses.MaskEffectInstance
* @see mx.effects.TweenEffect
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public class MaskEffect extends Effect
{
include "../core/Version.as";
//--------------------------------------------------------------------------
//
// Class constants
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static var AFFECTED_PROPERTIES:Array = [ "visible" ];
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @param target The Object to animate with this effect.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function MaskEffect(target:Object = null)
{
super(target);
instanceClass = MaskEffectInstance;
hideFocusRing = true;
}
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// createMaskFunction
//----------------------------------
/**
* Function called when the effect creates the mask.
* The default value is a function that returns a Rectangle
* with the same dimensions as the target.
*
* <p>The custom mask function has the following signature:</p>
*
* <pre>
* public function createLargeMask(targ:Object, bounds:Rectangle):Shape
* {
* var myMask:Shape = new FlexShape();
*
* // Create mask.
*
* return myMask;
* }
* </pre>
*
* <p>Your custom mask function takes an argument
* corresponding to the target component of the effect,
* and a second argument that defines the dimensions of the
* target so that you can correctly size the mask.
* You use that argument to access properties of the target
* component, such as <code>width</code> and <code>height</code>,
* so that you can create a mask with the correct size.</p>
*
* <p>The function returns a single Shape object
* that defines the mask.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var createMaskFunction:Function;
//----------------------------------
// moveEasingFunction
//----------------------------------
/**
* Easing function to use for moving the mask.
* @default null
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var moveEasingFunction:Function;
//----------------------------------
// persistAfterEnd
//----------------------------------
[Inspectable(category="General", format="Boolean", defaultValue="false")]
/**
* @private
* Flag indicating whether the mask is removed automatically
* when the effect finishes. If false, it is removed.
*
* @default true
*/
mx_internal var persistAfterEnd:Boolean = false;
//----------------------------------
// scaleEasingFunction
//----------------------------------
/**
* Easing function to use for scaling the mask.
* @default null
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var scaleEasingFunction:Function;
//----------------------------------
// scaleXFrom
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Initial scaleX for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>scaleXFrom</code>, <code>scaleYFrom</code>,
* <code>scaleXTo</code>, and <code>scaleX</code>.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var scaleXFrom:Number;
//----------------------------------
// scaleXTo
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Ending scaleX for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>scaleXFrom</code>, <code>scaleYFrom</code>,
* <code>scaleXTo</code>, and <code>scaleX</code>.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var scaleXTo:Number;
//----------------------------------
// scaleYFrom
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Initial scaleY for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>scaleXFrom</code>, <code>scaleYFrom</code>,
* <code>scaleXTo</code>, and <code>scaleX</code>.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var scaleYFrom:Number;
//----------------------------------
// scaleYTo
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Ending scaleY for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>scaleXFrom</code>, <code>scaleYFrom</code>,
* <code>scaleXTo</code>, and <code>scaleX</code>.</p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var scaleYTo:Number;
//----------------------------------
// showTarget
//----------------------------------
/**
* @private
* Storage for the showTarget property.
*/
private var _showTarget:Boolean = true;
/**
* @private
*/
private var _showExplicitlySet:Boolean = false;
[Inspectable(category="General", defaultValue="true")]
/**
* Specifies that the target component is becoming visible,
* <code>true</code>, or invisible, <code>false</code>.
*
* If you specify this effect for a <code>showEffect</code> or
* <code>hideEffect</code> trigger, Flex sets the
* <code>showTarget</code> property for you, either to
* <code>true</code> if the component becomes visible,
* or <code>false</code> if the component becomes invisible.
* If you use this effect with a different effect trigger,
* you should set it yourself, often within the
* event listener for the <code>startEffect</code> event.
*
* @default true
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get showTarget():Boolean
{
return _showTarget;
}
/**
* @private
*/
public function set showTarget(value:Boolean):void
{
_showTarget = value;
_showExplicitlySet = true;
}
//----------------------------------
// xFrom
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Initial position's x coordinate for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>xFrom</code>, <code>yFrom</code>, <code>xTo</code>,
* and <code>yTo</code>. </p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var xFrom:Number;
//----------------------------------
// xTo
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Destination position's x coordinate for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>xFrom</code>, <code>yFrom</code>, <code>xTo</code>,
* and <code>yTo</code>. </p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var xTo:Number;
//----------------------------------
// yFrom
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Initial position's y coordinate for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>xFrom</code>, <code>yFrom</code>, <code>xTo</code>,
* and <code>yTo</code>. </p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var yFrom:Number;
//----------------------------------
// yTo
//----------------------------------
[Inspectable(category="General", defaultValue="NaN")]
/**
* Destination position's y coordinate for mask.
*
* <p>To specify this property,
* you must specify all four of these properties:
* <code>xFrom</code>, <code>yFrom</code>, <code>xTo</code>,
* and <code>yTo</code>. </p>
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public var yTo:Number;
//--------------------------------------------------------------------------
//
// Overridden properties
//
//--------------------------------------------------------------------------
/**
* @private
*/
override public function set hideFocusRing(value:Boolean):void
{
super.hideFocusRing = value;
}
/**
* @private
*/
override public function get hideFocusRing():Boolean
{
return super.hideFocusRing;
}
//--------------------------------------------------------------------------
//
// Overridden methods
//
//--------------------------------------------------------------------------
/**
* Returns the component properties modified by this effect.
* This method returns an Array containing:
* <code>[ "visible", "width", "height" ]</code>.
* Since the WipeDown, WipeLeft, WipeRight, and WipeDown effect
* subclasses all modify these same properties, those classes
* do not implement this method.
*
* <p>If you subclass the MaskEffect class to create a custom effect,
* and it modifies a different set of properties on the target,
* you must override this method
* and return an Array containing a list of the properties
* modified by your subclass.</p>
*
* @return An Array of Strings specifying the names of the
* properties modified by this effect.
*
* @see mx.effects.Effect#getAffectedProperties()
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
override public function getAffectedProperties():Array /* of String */
{
return AFFECTED_PROPERTIES;
}
/**
* @private
*/
override protected function initInstance(instance:IEffectInstance):void
{
super.initInstance(instance);
var maskEffectInstance:MaskEffectInstance = MaskEffectInstance(instance);
if (_showExplicitlySet)
maskEffectInstance.showTarget = showTarget;
maskEffectInstance.xFrom = xFrom;
maskEffectInstance.yFrom = yFrom;
maskEffectInstance.xTo = xTo;
maskEffectInstance.yTo = yTo;
maskEffectInstance.scaleXFrom = scaleXFrom;
maskEffectInstance.scaleXTo = scaleXTo;
maskEffectInstance.scaleYFrom = scaleYFrom;
maskEffectInstance.scaleYTo = scaleYTo;
maskEffectInstance.moveEasingFunction = moveEasingFunction;
maskEffectInstance.scaleEasingFunction = scaleEasingFunction;
maskEffectInstance.createMaskFunction = createMaskFunction;
maskEffectInstance.persistAfterEnd = persistAfterEnd;
EventDispatcher(maskEffectInstance).addEventListener(TweenEvent.TWEEN_START, tweenEventHandler);
EventDispatcher(maskEffectInstance).addEventListener(TweenEvent.TWEEN_UPDATE, tweenEventHandler);
EventDispatcher(maskEffectInstance).addEventListener(TweenEvent.TWEEN_END, tweenEventHandler);
}
//--------------------------------------------------------------------------
//
// Event handlers
//
//--------------------------------------------------------------------------
/**
* Called when the TweenEffect dispatches a TweenEvent.
* If you override this method, ensure that you call the super method.
*
* @param event An event object of type TweenEvent.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
protected function tweenEventHandler(event:TweenEvent):void
{
dispatchEvent(event);
}
}
}