牧羊岛

懒是不会有好果子吃滴//
随笔 - 241, 文章 - 19, 评论 - 30, 阅读 - 41万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一个as3的alert

Posted on   牧羊岛  阅读(2842)  评论(0编辑  收藏  举报

研究地址:http://fatal-exception.co.uk/blog/?p=69

 

Alert.as

package com.Message {
    //
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.GradientType;
    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.events.MouseEvent;
    import flash.filters.BitmapFilter;
    import flash.filters.BitmapFilterQuality;
    import flash.filters.BlurFilter;
    import flash.filters.DropShadowFilter;
    import flash.filters.GlowFilter;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    //
    public class Alert {
        //
        private static var stage:Stage = null;
        private static var btnWidth:int = 75;
        private static var btnHeight:int = 18;
        private static var minimumWidths:Array = new Array(150, 230, 310);
        //
        /*  ALERT DIALOG OPTIONS
         
        background:String       -   Type of background
                                    >    "none" - invisible background
                                    >    "nonenotmodal" -  no background and make the area behind the Alert prompt focussable
                                    >    "simple -  simple colour background
                                    >    "blur" -  blurred background
                                    "simple" style is used if background is not specified
         
        buttons:Array           -   An array (maximum of 3) containing the Strings of the buttons to be shown in the Alert prompt
        callBack:Function       -   The function to be called when a button on the Alert prompt has been clicked - returns the name of the button that was clicked
        colour:int              -   Main colour for the Alert
        promptAlpha:int         -   Alpha of the Alert prompt
        textColour:int          -   Colour of the text shown in the Alert dialog
        position:Point          -   Position of the Alert prompt
     
        */
        public static function init(stageReference:Stage):void {
            stage = stageReference;
        }
        public static function show(Text:* = "Made by dVyper", ALERTOPTIONS:Object = null):void {
            if (stage == null) {
                trace("Alert class has not been initialised!");
                return;
            }
            var alertOptions:AlertOptions = new AlertOptions(ALERTOPTIONS, Text);
            var myAlert:Sprite = new Sprite();
            myAlert.addChild(createBackground(alertOptions));
            myAlert.addChild(getPrompt(alertOptions));
            assignListeners(myAlert, alertOptions);
            stage.addChild(myAlert);
        }
        //
        private static function assignListeners(myAlert:Sprite, alertOptions:AlertOptions):void {
            var promptBackground:* = myAlert.getChildAt(1);
            var allButtons:Array = new Array();
            for (var n:int;n<alertOptions.buttons.length;n++) {
                var button:SimpleButton = promptBackground.getChildByName(alertOptions.buttons[n]);
                button.addEventListener(MouseEvent.CLICK, myFunction);
                allButtons.push(button);
            }
            //  THIS IS DECLARED HERE SIMPLY SO I HAVE ACCESS TO alertOptions
            function myFunction(event:MouseEvent):void {
                for (var i:int;i<allButtons.length;i++) {
                    allButtons[i].removeEventListener(MouseEvent.CLICK, myFunction);
                }
                closeAlert(myAlert);
                if (alertOptions.callback != null) alertOptions.callback(event.target.name);
            }
        }
        //
        private static function closeAlert(myAlert:Sprite):void {
            var promptBackground:* = myAlert.getChildAt(1);
            promptBackground.removeEventListener(MouseEvent.MOUSE_DOWN, doStartDrag);
            promptBackground.removeEventListener(MouseEvent.MOUSE_UP, doStopDrag);
            stage.removeChild(myAlert);
            myAlert = null;
        }
        //  Creates the background for the Alert
        private static function createBackground(alertOptions:AlertOptions):Sprite {
            var myBackground:Sprite = new Sprite();
            var colour:int = alertOptions.colour;
            switch (alertOptions.background) {
                case "blur" :
                    var BackgroundBD:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xFF000000+colour);
                    var stageBackground:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
                    stageBackground.draw(stage);
                    var rect:Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
                    var point:Point = new Point(0, 0);
                    var multiplier:uint = 120;
                    BackgroundBD.merge(stageBackground, rect, point, multiplier, multiplier, multiplier, multiplier);
                    BackgroundBD.applyFilter(BackgroundBD, rect, point, new BlurFilter(5, 5));
                    var bitmap:Bitmap = new Bitmap(BackgroundBD);
                    myBackground.addChild(bitmap);
                    break;
                case "none" :
                    myBackground.graphics.beginFill(colour, 0); //  BACKGROUND IS STILL THERE BUT IS INVISIBLE
                    myBackground.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
                    myBackground.graphics.endFill();
                    break;
                case "nonenotmodal" :
                    //  DRAW NO BACKGROUND AT ALL
                    break;
                case "simple" :
                    myBackground.graphics.beginFill(colour, 0.3);
                    myBackground.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
                    myBackground.graphics.endFill();
                    break;
            }
            return myBackground;
        }
        //  Returns an 'OK' button
        private static function createButton(buttonText:String, alertOptions:AlertOptions):SimpleButton {
            var colors:Array = new Array();
            var alphas:Array = new Array(1, 1);
            var ratios:Array = new Array(0, 255);
            var gradientMatrix:Matrix = new Matrix();
            gradientMatrix.createGradientBox(btnWidth, btnHeight, Math.PI/2, 0, 0);
            //
            var ellipseSize:int = 2;
            var btnUpState:Sprite = new Sprite();
            colors = [0xFFFFFF, alertOptions.colour];
            btnUpState.graphics.lineStyle(3, brightenColour(alertOptions.colour, -50));
            btnUpState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
            btnUpState.graphics.drawRoundRect(0, 0, btnWidth, btnHeight, ellipseSize, ellipseSize);
            btnUpState.addChild(createButtonTextField(buttonText, alertOptions));
            //
            var btnOverState:Sprite = new Sprite();
            colors = [0xFFFFFF, brightenColour(alertOptions.colour, 50)];
            btnOverState.graphics.lineStyle(1, brightenColour(alertOptions.colour, -50));
            btnOverState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
            btnOverState.graphics.drawRoundRect(0, 0, btnWidth, btnHeight, ellipseSize, ellipseSize);
            btnOverState.addChild(createButtonTextField(buttonText, alertOptions));
            //
            var btnDownState:Sprite = new Sprite();
            colors = [brightenColour(alertOptions.colour, -15), brightenColour(alertOptions.colour, 50)];
            btnDownState.graphics.lineStyle(1, brightenColour(alertOptions.colour, -50));
            btnDownState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
            btnDownState.graphics.drawRoundRect(0, 0, btnWidth, btnHeight, ellipseSize, ellipseSize);
            btnDownState.addChild(createButtonTextField(buttonText, alertOptions));
            //
            var myButton:SimpleButton = new SimpleButton(btnUpState, btnOverState, btnDownState, btnOverState);
            myButton.name = buttonText;
            return myButton;
        }
        //  returns a Sprite containing a prompt positioned in the middle of the stage
        private static function getPrompt(alertOptions:AlertOptions):Sprite {
            var actualPrompt:Sprite = createPrompt(alertOptions);
            actualPrompt.name = "actual_prompt";
            actualPrompt.addEventListener(MouseEvent.MOUSE_DOWN, doStartDrag);
            actualPrompt.addEventListener(MouseEvent.MOUSE_UP, doStopDrag);
            if (alertOptions.position) {
                actualPrompt.x = alertOptions.position.x;
                actualPrompt.y = alertOptions.position.y;
            } else {
                actualPrompt.x = (stage.stageWidth/2)-(actualPrompt.width/2);
                actualPrompt.y = (stage.stageHeight/2)-(actualPrompt.height/2);
            }
            return actualPrompt;
        }
        //
        private static function getBlurFilter():BitmapFilter {
            var blurX:Number = 100;
            var blurY:Number = 100;
            return new BlurFilter(blurX, blurY, BitmapFilterQuality.HIGH);
        }
        //
        private static function getDropShadowFilter(Colour:int):DropShadowFilter {
            var color:Number = 0x000000;
            var angle:Number = 90;
            var alpha:Number = 0.6;
            var blurX:Number = 12;
            var blurY:Number = 4;
            var distance:Number = 1;
            var strength:Number = 1;
            var inner:Boolean = false;
            var knockout:Boolean = false;
            var quality:Number = BitmapFilterQuality.LOW;
            return new DropShadowFilter(distance, angle, color, alpha, blurX, blurY, strength, quality, inner, knockout);
        }  
        //
        private static function getGlowFilter(Colour:int):GlowFilter {
            var color:Number = 0xFFFFFF;
            var alpha:Number = 0.8;
            var blurX:Number = 15;
            var blurY:Number = 15;
            var strength:Number = 0.7;
            var inner:Boolean = true;
            var knockout:Boolean = false;
            var quality:Number = BitmapFilterQuality.HIGH;
            return new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout);
        }
        //  returns a sprite containing a prompt complete with a background, the specified text and an OK button
        private static function createPrompt(alertOptions:AlertOptions):Sprite {
            var promptBackground:Sprite = new Sprite();
            var textField:TextField = createTextField(alertOptions);
            var myWidth:int = textField.width+30;
            var myHeight:int = textField.height+65;
            if (myWidth < minimumWidths[alertOptions.buttons.length-1]) {
                myWidth = minimumWidths[alertOptions.buttons.length-1];
            }
            if (myHeight < 100) {
                myHeight = 100;
            }
            if (myHeight > stage.stageHeight) {
                myHeight = stage.stageHeight - 20;
                textField.autoSize = TextFieldAutoSize.NONE;
                textField.height = stage.stageHeight-40;
            }
            //  Create a background for the prompt
            var ellipseSize:int = 10;
            promptBackground.graphics.lineStyle(1);
            promptBackground.graphics.beginFill(alertOptions.colour);
            promptBackground.graphics.drawRoundRect(0, 0, myWidth, myHeight, ellipseSize, ellipseSize);
            promptBackground.graphics.endFill();
            //  Add the specified text to the prompt
            textField.x = (promptBackground.width/2)-(textField.width/2);
            textField.y = (promptBackground.height/2)-(textField.height/2)-10;
            //  ADD SPECIFIED BUTTONS TO THE PROMPT
            var alertButtons:Array = new Array();
            for (var n:int;n<alertOptions.buttons.length;n++) {
                alertButtons.push(createButton(alertOptions.buttons[n], alertOptions));
            }
            promptBackground.filters = [getGlowFilter(alertOptions.colour), getDropShadowFilter(alertOptions.colour)];
            promptBackground.alpha = alertOptions.promptAlpha;
            var actualPrompt:Sprite = new Sprite();
            actualPrompt.addChild(promptBackground);
            switch (alertButtons.length) {
                case 1 :
                    alertButtons[0].x = (actualPrompt.width/2)-(btnWidth/2);
                    break;
                case 2 :
                    alertButtons[0].x = (actualPrompt.width/2)-btnWidth-10;
                    alertButtons[1].x = alertButtons[0].x+btnWidth+15;
                    break;
                case 3 :
                    alertButtons[1].x = (actualPrompt.width/2)-(btnWidth/2);
                    alertButtons[0].x = alertButtons[1].x-btnWidth-15;
                    alertButtons[2].x = alertButtons[1].x+btnWidth+15;
                    break;
            }
            actualPrompt.addChild(textField);
            for (var i:int;i<alertButtons.length;i++) {
                alertButtons[i].y = actualPrompt.height-35;
                actualPrompt.addChild(alertButtons[i]);
            }
            //
            return actualPrompt;
        }
        //
        private static function createButtonTextField(Text:String, alertOptions:AlertOptions):TextField {
            var myTextField:TextField = new TextField();
            myTextField.textColor = alertOptions.textColour;
            myTextField.selectable = false;
            myTextField.width = btnWidth;
            myTextField.height = btnHeight;
            var myTextFormat:TextFormat = new TextFormat();
            myTextFormat.align = TextFormatAlign.CENTER;
            myTextField.defaultTextFormat = myTextFormat;
            Text = "<b>"+Text+"</b>";
            myTextField.htmlText = '<font face="Verdana">'+Text+'</font>';
            myTextField.x = (btnWidth/2)-(myTextField.width/2);
            return myTextField;
        }
        private static function createTextField(alertOptions:AlertOptions):TextField {
            var Text:String = alertOptions.text;
            var myTextField:TextField = new TextField();
            myTextField.textColor = alertOptions.textColour;
            myTextField.multiline = true;
            myTextField.selectable = false;
            myTextField.autoSize = TextFieldAutoSize.CENTER;   
            myTextField.htmlText = '<font face="Verdana">'+Text+'</font>';
            myTextField.x = (btnWidth/2)-(myTextField.width/2);
            return myTextField;
        }
        //
        //  Helper functions
        //-----------------------------------------------------------------
        //
        //  returns a brighter version of the specified colour
        private static function brightenColour(colour:int, modifier:int):int {
            var hex:Array = hexToRGB(colour);
            var red:int = keepInBounds(hex[0]+modifier);
            var green:int = keepInBounds(hex[1]+modifier);
            var blue:int = keepInBounds(hex[2]+modifier);
            return RGBToHex(red, green, blue);
        }
        private static function doStartDrag(event:MouseEvent):void {
            if (event.target is Sprite) event.currentTarget.startDrag();
        }
        private static function doStopDrag(event:MouseEvent):void {
            if (event.target is Sprite) event.currentTarget.stopDrag();
        }
        private static function hexToRGB (hex:uint):Array {
            var Colours:Array = new Array();
            Colours.push(hex >> 16);
            var temp:uint = hex ^ Colours[0] << 16;
            Colours.push(temp >> 8);
            Colours.push(temp ^ Colours[1] << 8);
            return Colours;
        }
        private static function keepInBounds(number:int):int {
            if (number < 0)  number = 0;
            if (number > 255) number = 255;
            return number;
        }      
        private static function RGBToHex(uR:int, uG:int, uB:int):int {
            var uColor:uint;
            uColor =  (uR & 255) << 16;
            uColor += (uG & 255) << 8;
            uColor += (uB & 255);
            return uColor;
        }
    }
}
import flash.geom.Point;
internal class AlertOptions {
    //
    public var background:String;
    public var buttons:Array = new Array();
    public var callback:Function;
    public var colour:int;
    public var fadeIn:Boolean;
    public var position:Point;
    public var promptAlpha:Number;
    public var text:String;
    public var textColour:int = 0x000000;
    //
    public function AlertOptions(alertOptions:Object, Text:*):void {
        if (alertOptions != null) {
            if (alertOptions.background == null) {
                background = "simple"
            } else {
                background = alertOptions.background;
            }
            if (alertOptions.buttons == null) {
                buttons = ["OK"];
            } else {
                if (alertOptions.buttons.length > 3) {
                    buttons = alertOptions.buttons.slice(0, 2);
                } else {
                    buttons = alertOptions.buttons;
                }
            }
            callback = alertOptions.callback;
            if (alertOptions.colour == null) {
                colour = 0x4E7DB1;
            } else {
                colour = alertOptions.colour;
            }
            position = alertOptions.position;
            if (alertOptions.promptAlpha == null) {
                promptAlpha = 0.9;
            } else {
                promptAlpha = alertOptions.promptAlpha;
            }
            if (alertOptions.textColour != null) {
                textColour = alertOptions.textColour;
            } else {
                textColour = 0x000000;
            }
        } else {
            background = "simple";
            buttons = ["OK"];
            colour = 0x4E7DB1;
            promptAlpha = 0.9;
            textColour = 0x000000;
        }
        text = Text.toString();
    }
}

点击右上角即可分享
微信分享提示