//////////////////////////////////////////////////////////////////////////////// // // 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.display.GraphicsGradientFill; import flash.display.GraphicsStroke; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; import mx.core.mx_internal; use namespace mx_internal; /** * The RadialGradientStroke class lets you specify a gradient filled stroke. * You use the RadialGradientStroke class, along with the GradientEntry class, * to define a gradient stroke. * * @see mx.graphics.Stroke * @see mx.graphics.GradientEntry * @see mx.graphics.RadialGradient * @see flash.display.Graphics * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class RadialGradientStroke extends GradientStroke { /** * Constructor. * * @param weight Specifies the line weight, in pixels. * This parameter is optional, * with a default value of 1. * * @param pixelHinting A Boolean value that specifies * whether to hint strokes to full pixels. * This affects both the position of anchors of a curve * and the line stroke size itself. * With pixelHinting set to true, * Flash Player and AIR hint line widths to full pixel widths. * With pixelHinting set to false, * disjoints can appear for curves and straight lines. * This parameter is optional, * with a default value of false. * * @param scaleMode A value from the LineScaleMode class * that specifies which scale mode to use. * Valid values are LineScaleMode.HORIZONTAL, * LineScaleMode.NONE, LineScaleMode.NORMAL, * and LineScaleMode.VERTICAL. * This parameter is optional, * with a default value of LineScaleMode.NORMAL. * * @param caps A value from the CapsStyle class * that specifies the type of caps at the end of lines. * Valid values are CapsStyle.NONE, * CapsStyle.ROUND, and CapsStyle.SQUARE. * A null value is equivalent to * CapsStyle.ROUND. * This parameter is optional, * with a default value of CapsStyle.ROUND. * * @param joints A value from the JointStyle class * that specifies the type of joint appearance used at angles. * Valid values are JointStyle.BEVEL, * JointStyle.MITER, and JointStyle.ROUND. * A null value is equivalent to * JointStyle.ROUND. * This parameter is optional, * with a default value of JointStyle.ROUND. * * @param miterLimit A number that indicates the limit * at which a miter is cut off. * Valid values range from 1 to 255 * (and values outside of that range are rounded to 1 or 255). * This value is only used if the jointStyle property * is set to miter. * The miterLimit value represents the length that a miter * can extend beyond the point at which the lines meet to form a joint. * The value expresses a factor of the line thickness. * For example, with a miterLimit factor of 2.5 and a * thickness of 10 pixels, the miter is cut off at 25 pixels. * This parameter is optional, * with a default value of 3. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function RadialGradientStroke(weight:Number = 1, pixelHinting:Boolean = false, scaleMode:String = "normal", caps:String = "round", joints:String = "round", miterLimit:Number = 3) { super(weight, pixelHinting, scaleMode, caps, joints, miterLimit); } /** * @private */ private static var commonMatrix:Matrix = new Matrix(); //---------------------------------- // 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.

* If you set 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 // //-------------------------------------------------------------------------- /** * @private */ override public function apply(graphics:Graphics, targetBounds:Rectangle, targetOrigin:Point):void { commonMatrix.identity(); graphics.lineStyle(weight, 0, 1, pixelHinting, scaleMode, caps, joints, miterLimit); if (targetBounds) calculateTransformationMatrix(targetBounds, commonMatrix, targetOrigin); graphics.lineGradientStyle(GradientType.RADIAL, colors, alphas, ratios, commonMatrix, spreadMethod, interpolationMethod, focalPointRatio); } /** * @private */ override public function createGraphicsStroke(targetBounds:Rectangle, targetOrigin:Point):GraphicsStroke { // The parent class sets the gradient stroke properties common to // LinearGradientStroke and RadialGradientStroke var graphicsStroke:GraphicsStroke = super.createGraphicsStroke(targetBounds, targetOrigin); if (graphicsStroke) { // Set other properties specific to this RadialGradientStroke GraphicsGradientFill(graphicsStroke.fill).type = GradientType.RADIAL; calculateTransformationMatrix(targetBounds, commonMatrix, targetOrigin); GraphicsGradientFill(graphicsStroke.fill).matrix = commonMatrix; GraphicsGradientFill(graphicsStroke.fill).focalPointRatio = focalPointRatio; } return graphicsStroke; } /** * @private * Calculates this RadialGradientStroke's transformation matrix */ private function calculateTransformationMatrix(targetBounds:Rectangle, matrix:Matrix, targetOrigin:Point):void { matrix.identity(); if (!compoundTransform) { 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; matrix.scale (w / GRADIENT_DIMENSION, h / GRADIENT_DIMENSION); matrix.rotate(!isNaN(_angle) ? _angle : rotationInRadians); matrix.translate(regX, regY); } else { matrix.scale(1 / GRADIENT_DIMENSION, 1 / GRADIENT_DIMENSION); matrix.concat(compoundTransform.matrix); matrix.translate(targetOrigin.x, targetOrigin.y); } } } }