AS3 ToolTip鼠标提示类
sshong 发表于2008年7月15日 20:51:00 更新于2008年11月25日 07:26:00
由于项目需要,今天写了一个鼠标提示类,现在共享出来,欢迎大家探讨。

ToolTip.as
/** *Author: ATHER Shu 2008.7.15 * ToolTip类: 鼠标提示类 * 功能: * 1.绑定某DisplayObject以显示鼠标提示 BindDO * 2.去除某DisplayObject绑定 LooseDO * 3.动态更改某DisplayObject鼠标提示信息 setDOInfo * 4.测试某DisObject是否已经绑定 TestDOBinding * 5.动态隐藏所有鼠标提示 hideToolTip * 6.动态显示所有鼠标提示 showToolTip * 7.清空所有鼠标提示 removeToolTip * 8.设定全局鼠标提示样式 setTipProperty * http://www.asarea.me * ATHER Shu(AS) */ package cn.asarea.tool {     import flash.display.DisplayObject;     import flash.display.Graphics;     import flash.display.Sprite;     import flash.display.Stage;     import flash.events.MouseEvent;     import flash.text.TextField;     import flash.text.TextFieldAutoSize;     import flash.text.TextFormat;     import flash.filters.DropShadowFilter;     public class ToolTip extends Sprite     {         static private var m_stage:Stage;//注,tooltip必须加到stage下         static private var m_ntxtcolor:uint=0x000000;         static private var m_ntxtsize:int=12;         static private var m_nbordercolor:uint=0x000000;         static private var m_nbgcolor:uint=0xFFFFCC;         static private var m_nmaxtxtwidth:Number=200;         //         static private var m_uniqueInstance:ToolTip;         //         private var m_arrDOTips:Array;         private var m_tipTxt:TextField;         //         public function ToolTip()         {             super();             m_arrDOTips = new Array();         }         //获取全局唯一实例         private static function getInstance():ToolTip         {             if(m_uniqueInstance == null)             {                 m_uniqueInstance = new ToolTip();                 m_uniqueInstance.visible = false;                 m_uniqueInstance.m_tipTxt = new TextField();                 m_uniqueInstance.m_tipTxt.autoSize = TextFieldAutoSize.LEFT;                 m_uniqueInstance.m_tipTxt.selectable = false;                 m_uniqueInstance.addChild(m_uniqueInstance.m_tipTxt);                 //                 m_stage.addChild(m_uniqueInstance);             }             return m_uniqueInstance;         }         //清空tooltips,注:不是隐藏所有,而是彻底清空,如果要隐藏,某一时刻又显示出来的话,采用hide和show         public static function removeToolTip():void         {             for(var i:int=0; i<getInstance().DOTips.length; i++)             {                 getInstance().DOTips[i].DO.removeEventListener(MouseEvent.ROLL_OVER, showtip);                 getInstance().DOTips[i].DO.removeEventListener(MouseEvent.ROLL_OUT, hidetip);                 getInstance().DOTips[i].DO.removeEventListener(MouseEvent.MOUSE_MOVE, movetip);                 getInstance().DOTips[i] = null;                 m_stage.removeChild(getInstance());                 m_uniqueInstance = null;             }         }         //暂时隐藏         public static function hideToolTip():void         {             m_stage.removeChild(getInstance());         }         //再次show         public static function showToolTip():void         {             m_stage.addChild(getInstance());         }         //添加某DO的tip绑定         public static function BindDO(DO:DisplayObject, info:String):void         {             //test if already been binded             if(TestDOBinding(DO) == -1)             {                 //add to array                 var dotip:Object = {DO:DO, info:info};                 getInstance().DOTips.push(dotip);                 //                 DO.addEventListener(MouseEvent.ROLL_OVER, showtip);                 DO.addEventListener(MouseEvent.ROLL_OUT, hidetip);                 DO.addEventListener(MouseEvent.MOUSE_MOVE, movetip);             }         }         //去除某DO的tip绑定         public static function LooseDO(DO:DisplayObject):void         {             if(TestDOBinding(DO) != -1)             {                 for(var i:int=TestDOBinding(DO); i<getInstance().DOTips.length-1; i++)                 {                     getInstance().DOTips[i] = getInstance().DOTips[i+1];                 }                 getInstance().DOTips.pop();                 DO.removeEventListener(MouseEvent.ROLL_OVER, showtip);                 DO.removeEventListener(MouseEvent.ROLL_OUT, hidetip);                 DO.removeEventListener(MouseEvent.MOUSE_MOVE, movetip);             }         }         //更改某绑定DO的文字信息         public static function setDOInfo(DO:DisplayObject, info:String):void         {             if(TestDOBinding(DO) == -1)                 BindDO(DO, info);             else                 getInstance().DOTips[TestDOBinding(DO)].info = info;         }         //测试是否已经绑定,绑定则返回数组中的次序,否则返回-1         public static function TestDOBinding(DO:DisplayObject):int         {             var flag:Boolean = false;             for(var i:int=0; i<getInstance().DOTips.length; i++)             {                 if(getInstance().DOTips[i].DO == DO)                 {                     flag = true;                     break;                 }             }             return (flag ? i : -1);         }         //         private static function showtip(evt:MouseEvent):void         {             getInstance().x = evt.stageX;             getInstance().y = evt.stageY + 20;//注,20是鼠标高度             getInstance().m_tipTxt.wordWrap = false;             getInstance().m_tipTxt.text = getInstance().DOTips[TestDOBinding(evt.target as DisplayObject)].info;             updatetip();             getInstance().visible = true;         }         private static function hidetip(evt:MouseEvent):void         {             getInstance().visible = false;         }         private static function movetip(evt:MouseEvent):void         {             getInstance().x = evt.stageX;             getInstance().y = evt.stageY + 20;         }         private static function updatetip():void         {             getInstance().m_tipTxt.textColor = m_ntxtcolor;             if(getInstance().m_tipTxt.width > m_nmaxtxtwidth)             {                 getInstance().m_tipTxt.wordWrap = true;                  getInstance().m_tipTxt.width = m_nmaxtxtwidth;             }             var tf:TextFormat = new TextFormat();             tf.size = m_ntxtsize;             getInstance().m_tipTxt.setTextFormat(tf);             //             var gp:Graphics = getInstance().graphics;             gp.clear();             gp.lineStyle(0, m_nbordercolor);             gp.beginFill(m_nbgcolor);             gp.drawRect(0, 0, getInstance().m_tipTxt.width, getInstance().m_tipTxt.height);             gp.endFill();             //加阴影             getInstance().filters =[new DropShadowFilter(2)];         }         //         public static function set stage(stage:Stage):void         {             m_stage = stage;         }         public static function setTipProperty(txtcolor:uint=0x000000, txtsize:int=12, maxtxtwidth:int=200, bordercolor:uint=0x000000, bgcolor:uint=0xFFFFCC):void         {             m_ntxtcolor = txtcolor;             m_ntxtsize = txtsize;             m_nmaxtxtwidth = maxtxtwidth;             m_nbordercolor = bordercolor;             m_nbgcolor = bgcolor;         }         //         private function get DOTips():Array         {             return m_arrDOTips;         }     } }

使用示例:
import cn.asarea.tool.*; ToolTip.stage = stage; //ToolTip.setTipProperty(0xcccccc, 15, 300, 0xcccccc, 0x333300); ToolTip.BindDO(tipDO1, "欢迎访问http://www.asarae.cn"); ToolTip.BindDO(tipDO2, "ATHER Shu"); //ToolTip.hideToolTip(); //ToolTip.showToolTip(); //ToolTip.removeToolTip(); //ToolTip.LooseDO(tipDO1); ToolTip.setDOInfo(tipDO2, "say hello to AS");
源文件下载:asarea鼠标提示类demo
演示:
标签:as3鼠标提示tooltip分类:As3&Flex阅读:12106
评论
sshong2015年1月18日 11:31 回复
初始化的时机不对吧,要等application完全初始化加到stage后再初始化tooltip
xxzx2014年12月17日 10:51
flex 4里面按照代码导入  老是弹访问的属性stage   tipDO1   tipDO2未定义 请教下怎么解决
xxzx2014年12月17日 10:51
flex 4里面按照代码导入  老是弹访问的属性stage   tipDO1   tipDO2未定义 请教下怎么解决
sshong2014年11月29日 10:25 回复
我估计是mousemove事件的原因,你可以调试下是不是地图的拖拽也是根据mousemove,然后再寻找两边的冲突以解决。
李毅2014年11月10日 09:16
我在做一个电子地图,你的代码帮了我大忙,实现了进入指定区域文字跟随鼠标的功能。但是有个问题,就是屏蔽了之前的鼠标拖拽地图的事件,如何解决呢?
李毅2014年11月10日 09:16
我在做一个电子地图,你的代码帮了我大忙,实现了进入指定区域文字跟随鼠标的功能。但是有个问题,就是屏蔽了之前的鼠标拖拽地图的事件,如何解决呢?
sshong2014年3月28日 20:07 回复
饿,这都是几年前写的了,不知道哪里中文支持不好,我检查下?
Moldshow2014年3月26日 19:55
很佩服博主,也很羡慕!!博主写的这段程序对我很有用,但是对中文支持不好,麻烦博主修改下,谢谢!手机-13527354691
Moldshow2014年3月26日 19:55
很佩服博主,也很羡慕!!博主写的这段程序对我很有用,但是对中文支持不好,麻烦博主修改下,谢谢!手机-13527354691
sshong2009年6月7日 09:45 回复
呵呵
su272009年6月4日 14:02
我在项目中使用了这个类,感谢你的分享。
su272009年6月4日 14:02
我在项目中使用了这个类,感谢你的分享。
sshong2009年2月16日 22:27 回复
你好,不知道你是否有准确设定tooltip的stage属性
yjrl2009年2月16日 20:30
1178: 试图访问不可访问的属性 stage (通过 static 类型 Class 引用)。
1061: 调用可能未定义的方法 BindDO (通过 static 类型 Class 引用)。
1061: 调用可能未定义的方法 setDOInfo (通过 static 类型 Class 引用)。
为什么我的问题是这些,我都和你的一样的。怎么会出错啊?
yjrl2009年2月16日 20:30
1178: 试图访问不可访问的属性 stage (通过 static 类型 Class 引用)。
1061: 调用可能未定义的方法 BindDO (通过 static 类型 Class 引用)。
1061: 调用可能未定义的方法 setDOInfo (通过 static 类型 Class 引用)。
为什么我的问题是这些,我都和你的一样的。怎么会出错啊?
sshong2009年1月23日 14:52 回复
其实只需在update里判断下tooltip的x+width以及y+height是不是在设定范围内即可做到,你可以自己扩充下
秋色烽火2009年1月23日 12:20
如果能自动换行那就更完美了,还有就是边界的自动切换
sshong2009年1月23日 14:51 回复
是的
秋色烽火2009年1月23日 12:31
这里用到单例模式吗?
秋色烽火2009年1月23日 12:31
这里用到单例模式吗?
秋色烽火2009年1月23日 12:20
如果能自动换行那就更完美了,还有就是边界的自动切换
sshong2009年1月1日 13:30
已回复,其实还是你的stage没有赋好,因为你在构造的时候,还没有加到舞台,没有stage属性,所以要侦听添加到舞台事件,再设定stage
添加评论
您的大名,限长10汉字,20英文(*)
电子信箱(*)
您的网站
正文,限长500汉字,1000英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅