package { import flash.display.*; import flash.events.*; import flash.filters.*; import flash.geom.Point; import flash.text.*; public class SimpleToolTip extends Sprite { //本实例引用 private static var _instance:SimpleToolTip = null; public function SimpleToolTip():void { if(_instance) throw new Error("just one instance"); } public static function getInstance():SimpleToolTip { if(!_instance) _instance = new SimpleToolTip(); return _instance; } //====================================== private var txt:String = ""; private var tool_mc:Sprite = null; private var lbl:TextField = null; private var bg:Shape = null; //the stage of showing the toolTip private var _containerStage:Stage = null; private var _array:Array = null; //====================================== /** * Initialization * @containerStage the stage of showing the toolTip */ public function init(containerStage:Stage):void { _containerStage = containerStage; _instance.createTool(); _instance.addChild(_instance.tool_mc); _instance._array = new Array(); } /** * add the tip to the displayObject */ public function registerToolTip(obj:DisplayObject,txt:String):void { if (_containerStage == null) { throw new Error("请先调用init初始化"); return; } var index:int = _instance.checkExists(obj); if (index > 0) { //if exist , modify it _instance._array[index]["txt"] = txt; } else { //if not exists , add new one _instance._array.push({"obj":obj,"txt":txt}); obj.addEventListener(MouseEvent.MOUSE_OVER,_instance.over , false , 0 , true ); obj.addEventListener(MouseEvent.MOUSE_OUT,_instance.out, false , 0 , true ); } } /** * Determine whether the displayObject has been registered the ToolTip */ private function checkExists(obj:DisplayObject):int { for (var i:int = 0; i<_array.length; i++) { if (_array[i]["obj"] == obj) { return i; } } return -1; } private function over(e:MouseEvent):void { changePosition(e); e.updateAfterEvent(); _containerStage.addChild(tool_mc); this.txt = _array[checkExists(DisplayObject(e.target))].txt; changeTool(); e.target.addEventListener(MouseEvent.MOUSE_MOVE,moveMouse , false , 0 , true); } private function moveMouse(e:MouseEvent):void { changePosition(e); } private function out(e:MouseEvent):void { e.target.removeEventListener(MouseEvent.MOUSE_MOVE,moveMouse); if (tool_mc.parent != null) { tool_mc.parent.removeChild(tool_mc); } } private function changePosition(e:MouseEvent):void { var gl_loc:Point = localToGlobal(new Point(e.stageX,e.stageY)); tool_mc.x = gl_loc.x + 5; tool_mc.y = gl_loc.y + 5; if (tool_mc.x + lbl.textWidth > _containerStage.stageWidth-15) { tool_mc.x = gl_loc.x - lbl.textWidth - 15; } if (tool_mc.y + lbl.textHeight > _containerStage.stageHeight-15) { tool_mc.y = gl_loc.y - lbl.textHeight - 15; } } private function createTool():void { tool_mc = new Sprite(); lbl = new TextField(); var format:TextFormat = new TextFormat(); format.font = "Arial" ; format.size = 14 ; format.color = 0xffffff ; lbl.defaultTextFormat = format; lbl.filters = [growFilter(0x000000,5)]; tool_mc.addChild(lbl); lbl.x=5; lbl.y=3; changeTool(); } private function changeTool():void { lbl.wordWrap = true; lbl.htmlText = txt; lbl.multiline = true; lbl.autoSize = TextFieldAutoSize.LEFT; lbl.width = 250; lbl.selectable = false; } public function removeRegister(obj:DisplayObject):void { removeTooltip(obj); if (obj is DisplayObjectContainer) { var objCon:DisplayObjectContainer = obj as DisplayObjectContainer; for (var j:int = 0; j 0) { removeRegister(objCon.getChildAt(j)); } } } if( _instance.tool_mc.parent!=null ){ _instance.tool_mc.parent.removeChild(_instance.tool_mc); } } private function removeTooltip(obj:DisplayObject):void { for (var i:int = 0; i<_instance._array.length; i++) { if (_instance._array[i].obj == obj) { obj.removeEventListener(MouseEvent.MOUSE_MOVE,_instance.moveMouse); obj.removeEventListener(MouseEvent.MOUSE_OVER,_instance.over); obj.removeEventListener(MouseEvent.MOUSE_OUT,_instance.out); _instance._array[i].obj = null; _instance._array.splice(i,1); return; } } } public static function growFilter( color:Number = 0xffffff , blur:Number = 8 , strength:Number = 8 ):BitmapFilter { var color:Number = color ; var alpha:Number =1; var blurX:Number = blur; var blurY:Number = blur; var strength:Number = strength ; var inner:Boolean = false ; var knockout:Boolean = false; var quality:Number = BitmapFilterQuality.LOW; return new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout); } /** * clear all the tooltip */ public function release():void { for (var i:int = 0; i<_instance._array.length; i++) { _instance._array[i].obj.removeEventListener(MouseEvent.MOUSE_MOVE,_instance.moveMouse); _instance._array[i].obj.removeEventListener(MouseEvent.MOUSE_OVER,_instance.over); _instance._array[i].obj.removeEventListener(MouseEvent.MOUSE_OUT,_instance.out); _instance._array[i].obj = null; _instance._array[i] = null; } _instance._array.length = 0; _instance._array = null; _instance.lbl = null; _instance.bg = null; if (_instance.tool_mc.parent != null) { _containerStage.removeChild(_instance.tool_mc); } _instance.tool_mc = null; _containerStage = null; _instance = null; } } }