zoukankan      html  css  js  c++  java
  • 一个as3的alert

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

  • 相关阅读:
    OC与AS3的观察者模式比较以及外部回调
    判断矩形重叠
    2010谷歌校园招聘笔试题
    2011谷歌校园招聘笔试题
    2012Google校园招聘笔试题
    2013谷歌校园招聘笔试题2
    2013谷歌校园招聘笔试题
    2012搜狗校园招聘笔试题
    2013搜狗校园招聘笔试题
    搜狐面试题
  • 原文地址:https://www.cnblogs.com/ShepherdIsland/p/1786209.html
Copyright © 2011-2022 走看看