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阅读:7260
评论
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英文(*)
验证码(*) 单击刷新验证码
联系我
博客订阅