AS3核心类中没有ToolTip类,Flex中的ToolTip类没法用在AS3工程中,Aswing的JToolTip不错,不过如果仅仅为了使用这一个类而导入Aswing就不太明智了。由于最近的项目需要用到ToolTip,我就索性自己写了一个,特与大家分享。
package { import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.display.Sprite; import flash.display.DisplayObjectContainer; import flash.display.InteractiveObject; /** * 提示文本 * @author Flying http://www.riafan.com */ public class AS3ToolTip{ private static var toolTip : TextField; private static var format : TextFormat; private static var owner :DisplayObjectContainer; //tooltip对象是否可用 public static var enabled : Boolean = true; //目标对象数组 private static var owners : Array = new Array(); //文本对象数组 private static var texts : Array = new Array(); public function AS3ToolTip() { } /** * 获取/设置提示文本的顶级显示对象 */ public static function get root() :DisplayObjectContainer{ return owner; } public static function set root(value :DisplayObjectContainer) : void { if (owner == null){ owner = value; } } /** * 新建一个提示文本 * * @param owner 要设置提示文本的目标对象 * @param text 提示文本的内容 */ public static function create(owner:InteractiveObject, text: String) : void { owners.push(owner); texts.push(text); owner.addEventListener(MouseEvent.MOUSE_OVER, AS3ToolTip.showToolTip); owner.addEventListener(MouseEvent.MOUSE_OUT, AS3ToolTip.hideToolTip); } /** * 显示提示文本 */ private static function showToolTip(e : MouseEvent) : void { //初始化动态文本 toolTip = new TextField(); toolTip.visible = true; toolTip.text = findText(InteractiveObject(e.currentTarget)); toolTip.background = true; toolTip.backgroundColor= 0xFFCC66; toolTip.border = true; toolTip.borderColor = 0x000000; toolTip.multiline = false; toolTip.wordWrap = false; toolTip.autoSize = TextFieldAutoSize.CENTER; toolTip.x = owner.mouseX + 16; toolTip.y = owner.mouseY - 24; //设置动态文本样式 format = new TextFormat(); format.font = "_sans"; format.leftMargin = 4; format.rightMargin = 4; format.size = 12; toolTip.setTextFormat(format); owner.addChild(toolTip); } /** * 隐藏提示文本 */ private static function hideToolTip(e : MouseEvent) : void { toolTip.visible = false; owner.removeEventListener(MouseEvent.MOUSE_OVER, showToolTip); owner.removeEventListener(MouseEvent.MOUSE_OUT, hideToolTip); } /** * 返回特定文本 * * @param target 目标对象 */ private static function findText(owner:InteractiveObject) : String { var index : int = owners.indexOf(owner); return texts[index]; } } }
用静态类实现的,理论上应该比较节约资源。这里用了两个数组传递text参数,算是一个小技巧。AS3ToolTip用法很简单,先设定它的root,再调用其create方法。create方法的owner参数限制为InteractiveObject类型,不过我想已经够用了。