白桦的天空

第一次的心动,永远的心痛!
  首页  :: 新随笔  :: 联系 :: 管理

AS3 提示类 - [AS3.0]

Posted on 2008-06-25 13:29  白桦的天空  阅读(498)  评论(0编辑  收藏  举报

package  {
 //
 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.Event;
 import flash.events.MouseEvent;
 import flash.filters.BitmapFilter;
 import flash.filters.BlurFilter;
 import flash.filters.BitmapFilterQuality;
 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.display.DisplayObject;
 //
 public class Alert {
  //
  private static var stage:Stage;
  private static var btnWidth:int = 45
  private static var btnHeight:int = 21;
  //
  public static function init(stageReference:Stage):void {
   stage = stageReference;
  }
  //
  public static function show(Text:* = "Made by Dark Vyper", callback:Function = null, Colour:int = 0x515EB7, textColour:int = 0x000000):void {
   if (stage == null) return;
   var myAlert:Sprite = new Sprite();
   myAlert.addChild(createBackground(Colour));
   myAlert.addChild(createPrompt(Text.toString(), Colour, textColour));
   assignListeners(myAlert, callback);
   stage.addChild(myAlert)
  }
  //
  private static function assignListeners(myAlert:Sprite, callback:Function):void {
   var Background:* = myAlert.getChildAt(1);
   var Prompt:* = Background.getChildAt(0);
   var OKbutton:* = Prompt.getChildAt(1);
   // Cause Alert to call specified function when alert has been closed
   if (callback != null) {
    function myFunction(myEvent:MouseEvent):void {
     OKbutton.removeEventListener(MouseEvent.CLICK, myFunction);
     closeAlert(myEvent);
     callback();
    };
    OKbutton.addEventListener(MouseEvent.CLICK, myFunction);
   } else {
    OKbutton.addEventListener(MouseEvent.CLICK, closeAlert);
   }
  }
  // removes the Alert from the display list
  private static function closeAlert(event:MouseEvent):void {
   var OKbutton:* = event.target;
   OKbutton.removeEventListener(MouseEvent.CLICK, closeAlert);
   var BG:* = event.target.parent;
   BG.removeEventListener(MouseEvent.CLICK, doStartDrag);
   BG.removeEventListener(MouseEvent.CLICK, doStopDrag);
   // messy I know...
   var myAlert:Sprite = event.target.parent.parent.parent;
   myAlert.parent.removeChild(myAlert);
  }
  // Creates the background for the Alert
  private static function createBackground(Colour:int):Sprite {
   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);
   var Background:Sprite = new Sprite();
   Background.addChild(bitmap);
   return Background;
  }
  // Returns an 'OK' button
  private static function createOKBtn(Colour:int, textColour:int):SimpleButton {
   var colors:Array = new Array();
   var alphas:Array = new Array(1, 1, 1);
   var ratios:Array = new Array(0, 128, 255);
   var gradientMatrix:Matrix = new Matrix();
   gradientMatrix.createGradientBox(btnWidth, btnHeight, Math.PI/2, 0, 0);
   //
   var btnUpState:Sprite = new Sprite();
   colors = [0xFFFFFF, Colour, 0xFFFFFF];
   btnUpState.graphics.lineStyle(1);
   btnUpState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
   btnUpState.graphics.drawRect(0, 0, btnWidth, btnHeight);
   btnUpState.addChild(getTextField("OK" , textColour, true));
   //
   var btnOverState:Sprite = new Sprite();
   colors = [0xFFFFFF, brightenColour(Colour, 50), 0xFFFFFF];
   btnOverState.graphics.lineStyle(1);
   btnOverState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
   btnOverState.graphics.drawRect(0, 0, btnWidth, btnHeight);
   btnOverState.addChild(getTextField("OK" , textColour, true))
   //
   var btnDownState:Sprite = new Sprite();
   colors = [Colour, brightenColour(Colour, 50), Colour];
   btnDownState.graphics.lineStyle(1);
   btnDownState.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, gradientMatrix);
   btnDownState.graphics.drawRect(0, 0, btnWidth, btnHeight);
   btnDownState.addChild(getTextField("OK" , textColour, true))
   //
   var myButton:SimpleButton = new SimpleButton(btnUpState, btnOverState, btnDownState, btnOverState);
   return myButton;
  }
  // returns a Sprite containing a prompt positioned in the middle of the stage
  private static function createPrompt(Text:String, Colour:int, textColour:int):Sprite {
   var holder:Sprite = new Sprite()
   holder.addEventListener(MouseEvent.MOUSE_DOWN, doStartDrag);
   holder.addEventListener(MouseEvent.MOUSE_UP, doStopDrag);
   holder.addChild(getPrompt(Text, Colour, textColour));
   holder.x = (stage.stageWidth/2)-(holder.width/2);
   holder.y = (stage.stageHeight/2)-(holder.height/2);
   holder.filters = [getGlowFilter(Colour), getDropShadowFilter(Colour)];
   return holder;
  }
  //
  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 = 45;
            var alpha:Number = 0.6;
            var blurX:Number = 8;
            var blurY:Number = 8;
            var distance:Number = 4;
            var strength:Number = 1.3;
            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 getPrompt(Text:String, Colour:int, textColour:int):Sprite {
   var prompt:Sprite = new Sprite();
   prompt.addEventListener(MouseEvent.MOUSE_DOWN, doStartDrag);
   prompt.addEventListener(MouseEvent.MOUSE_UP, doStopDrag);
   prompt.name = "alert";
   var textField:TextField = getTextField(Text, textColour);
   var myWidth:int = textField.width+10;
   var myHeight:int = textField.height+55;
   if (myWidth < 150) {
    myWidth = 150;
   }
   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 = 5;
   prompt.graphics.lineStyle(1);
   prompt.graphics.beginFill(Colour);
   prompt.graphics.drawRoundRect(0, 0, myWidth, myHeight, ellipseSize, ellipseSize);
   // Add the specified text to the prompt
   textField.x = (prompt.width/2)-(textField.width/2);
   textField.y = (prompt.height/2)-(textField.height/2)-10;
   prompt.addChild(textField);
   // Add an OK Button to the prompt
   var OKbutton:SimpleButton = createOKBtn(Colour, textColour);
   OKbutton.x = (prompt.width/2)-(OKbutton.width/2);
   OKbutton.y = prompt.height-35;
   prompt.addChild(OKbutton);
   //
   return prompt;
  }
  // Returns a textfield with the specified text
  private static function getTextField(Text:String, textColour:int, bold:Boolean = false):TextField {
   var myTextField:TextField = new TextField();
   myTextField.textColor = textColour;
   myTextField.name = "textfield";
   myTextField.multiline = true;
   myTextField.selectable = false;
   myTextField.autoSize = TextFieldAutoSize.CENTER;
   if (bold) {
    Text = "<b>"+Text+"</b>";
   }
   myTextField.htmlText = '<font face="Verdana">'+Text+'</font>';
   myTextField.x = (btnWidth/2)-(myTextField.width/2);
   myTextField.y = (btnHeight/2)-(myTextField.height/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.name != "textfield") {
    if (event.target.name == "alert") {
     event.target.startDrag();
    }
   }
  }
  private static function doStopDrag(event:MouseEvent):void {
   if (event.target.name != "textfield") {
    if (event.target.name == "alert") {
     event.target.stopDrag();
    }
   }
  }
  public 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;
  }
  // Stops any mouse events from getting below the alert
  private static function stopEvents(event:MouseEvent):void {
   event.stopImmediatePropagation();
  }
 }
}