////////////////////////////////////////////////////////////////////////////////
//
// 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.graphics
{
import flash.display.GradientType;
import flash.display.Graphics;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import mx.core.mx_internal;
use namespace mx_internal;
/**
* The RadialGradient class lets you specify a gradual color transition
* in the fill color.
* A radial gradient defines a fill pattern
* that radiates out from the center of a graphical element.
* You add a series of GradientEntry objects
* to the RadialGradient object's entries
Array
* to define the colors that make up the gradient fill.
*
*
In MXML, you define a RadialGradient by adding a series * of GradientEntry objects, as the following example shows: *
* <mx:fill> * <mx:RadialGradient> * <mx:entries> * <mx:GradientEntry color="0xC5C551" ratio="0.00" alpha="0.5"/> * <mx:GradientEntry color="0xFEFE24" ratio="0.33" alpha="0.5"/> * <mx:GradientEntry color="0xECEC21" ratio="0.66" alpha="0.5"/> * </mx:entries> * </mx:RadialGradient> * </mx:fill> ** * *
You can also define a RadialGradient as a fill for any graphic element * in ActionScript, as the following example shows: *
* * <?xml version="1.0"?> * <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> * <mx:Script> * import flash.display.Graphics; * import flash.geom.Rectangle; * import mx.graphics.GradientEntry; * import mx.graphics.RadialGradient; * * private function init():void * { * var w:Number = 200; * var h:Number = 200; * * var s:Sprite = new Sprite(); * // Add the new Sprite to the display list. * rawChildren.addChild(s); * * var g:Graphics = s.graphics; * g.lineStyle(1, 0x33CCFF, 1.0); * * var fill:RadialGradient = new RadialGradient(); * * var g1:GradientEntry = new GradientEntry(0xFFCC66, 0.00, 0.5); * var g2:GradientEntry = new GradientEntry(0x000000, 0.33, 0.5); * var g3:GradientEntry = new GradientEntry(0x99FF33, 0.66, 0.5); * * fill.entries = [ g1, g2, g3 ]; * * // Set focal point to upper left corner. * fill.angle = 45; * fill.focalPointRatio = -0.8; * * // Draw a box and fill it with the RadialGradient. * g.moveTo(0, 0); * fill.begin(g,new Rectangle(0, 0, w, h)); * g.lineTo(w, 0); * g.lineTo(w, h); * g.lineTo(0, h); * g.lineTo(0, 0); * fill.end(g); * } * </mx:Script> * </mx:Application> ** * * @mxml * *
The <mx:RadialGradient>
tag
* inherits all the tag attributes of its superclass,
* and adds the following tag attributes:
* <mx:RadialGradient * Properties * angle="0" * focalPointRatio="0" * /> ** * @see mx.graphics.GradientEntry * @see mx.graphics.LinearGradient * @see mx.graphics.IFill * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class RadialGradient extends GradientBase implements IFill { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function RadialGradient() { super(); } /** * @private */ private static var commonMatrix:Matrix = new Matrix(); //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- //---------------------------------- // focalPointRatio //---------------------------------- /** * @private * Storage for the focalPointRatio property. */ private var _focalPointRatio:Number = 0.0; [Bindable("propertyChange")] [Inspectable(category="General")] /** * Sets the location of the start of the radial fill. * *
Valid values are from -1.0
to 1.0
.
* A value of -1.0
sets the focal point
* (or, start of the gradient fill)
* on the left of the bounding Rectangle.
* A value of 1.0
sets the focal point
* on the right of the bounding Rectangle.
*
*
If you use this property in conjunction
* with the angle
property,
* this value specifies the degree of distance
* from the center that the focal point occurs.
* For example, with an angle of 45
* and focalPointRatio
of 0.25,
* the focal point is slightly lower and to the right of center.
* If you set focalPointRatio
to 0
,
* the focal point is in the middle of the bounding Rectangle.
focalPointRatio
to 1
,
* the focal point is all the way to the bottom right corner
* of the bounding Rectangle.
*
* @default 0.0
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get focalPointRatio():Number
{
return _focalPointRatio;
}
/**
* @private
*/
public function set focalPointRatio(value:Number):void
{
var oldValue:Number = _focalPointRatio;
if (value != oldValue)
{
_focalPointRatio = value;
dispatchGradientChangedEvent("focalPointRatio", oldValue, value);
}
}
//----------------------------------
// matrix
//----------------------------------
/**
* @private
*/
override public function set matrix(value:Matrix):void
{
scaleX = NaN;
scaleY = NaN;
super.matrix = value;
}
//----------------------------------
// scaleX
//----------------------------------
private var _scaleX:Number;
[Bindable("propertyChange")]
[Inspectable(category="General")]
/**
* The horizontal scale of the gradient transform, which defines the width of the (unrotated) gradient
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get scaleX():Number
{
return compoundTransform ? compoundTransform.scaleX : _scaleX;
}
/**
* @private
*/
public function set scaleX(value:Number):void
{
if (value != scaleX)
{
var oldValue:Number = scaleX;
if (compoundTransform)
{
// If we have a compoundTransform, only non-NaN values are allowed
if (!isNaN(value))
compoundTransform.scaleX = value;
}
else
{
_scaleX = value;
}
dispatchGradientChangedEvent("scaleX", oldValue, value);
}
}
//----------------------------------
// scaleY
//----------------------------------
private var _scaleY:Number;
[Bindable("propertyChange")]
[Inspectable(category="General")]
/**
* The vertical scale of the gradient transform, which defines the height of the (unrotated) gradient
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get scaleY():Number
{
return compoundTransform ? compoundTransform.scaleY : _scaleY;
}
/**
* @private
*/
public function set scaleY(value:Number):void
{
if (value != scaleY)
{
var oldValue:Number = scaleY;
if (compoundTransform)
{
// If we have a compoundTransform, only non-NaN values are allowed
if (!isNaN(value))
compoundTransform.scaleY = value;
}
else
{
_scaleY = value;
}
dispatchGradientChangedEvent("scaleY", oldValue, value);
}
}
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function begin(target:Graphics, targetBounds:Rectangle, targetOrigin:Point):void
{
var w:Number = !isNaN(scaleX) ? scaleX : targetBounds.width;
var h:Number = !isNaN(scaleY) ? scaleY : targetBounds.height;
var regX:Number = !isNaN(x) ? x + targetOrigin.x : targetBounds.left + targetBounds.width / 2;
var regY:Number = !isNaN(y) ? y + targetOrigin.y : targetBounds.top + targetBounds.height / 2;
commonMatrix.identity();
if (!compoundTransform)
{
commonMatrix.scale (w / GRADIENT_DIMENSION, h / GRADIENT_DIMENSION);
commonMatrix.rotate(!isNaN(_angle) ? _angle : rotationInRadians);
commonMatrix.translate(regX, regY);
}
else
{
commonMatrix.scale(1 / GRADIENT_DIMENSION, 1 / GRADIENT_DIMENSION);
commonMatrix.concat(compoundTransform.matrix);
commonMatrix.translate(targetOrigin.x, targetOrigin.y);
}
target.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios,
commonMatrix, spreadMethod, interpolationMethod, focalPointRatio);
}
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function end(target:Graphics):void
{
target.endFill();
}
}
}