研究地址: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();
}
}