`
wgcode
  • 浏览: 593483 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ToolTip类,趋于完美

阅读更多

东西虽小,内容丰富:自定义,缓动,淡入、淡出,自动调整位置。

package myas

{

        import flash.display.*;

        import flash.events.*;

        import flash.filters.*;

        import flash.geom.*;

        import flash.text.*;

        //import flash.utils.Timer;



        import fl.transitions.Tween;

        import fl.transitions.easing.*;

        import fl.transitions.TweenEvent;





        /**

         * Example:

                var tt:ToolTip = new ToolTip();

                tt.show( DisplayObject, "", "这里是信息" );

         或:

         var tf:TextFormat = new TextFormat();

        tf.bold = true;

        tf.size = 12;

        tf.color = 0xff0000;

        var contentFormat:TextFormat = new TextFormat();

        contentFormat.size = 14;

        contentFormat.color = 0xFFFFFF;

        contentFormat.bold = false;

        

        var tt:ToolTip = new ToolTip();

        tt.hook = true;

        tt.hookSize = 20;

        tt.cornerRadius = 20;

        tt.align = "center";

        tt.titleFormat = tf;

        tt.contentFormat = contentFormat;

        tt.show( DisplayObject, "Title Of This ToolTip", "Some Copy that would go below the ToolTip Title" );

         *

         ****** by zcheng  2011-3-22 626272689@qq.com

         基于* @author Duncan Reid, www.hy-brid.com  * @date October 17, 2008  * @version 1.1

         *

         */



        public class ToolTip extends Sprite

        {

                //objects

                private var _stage:Stage;

                private var _parentObject:DisplayObject;

                private var _tf:TextField;// title field

                private var _cf:TextField;//content field

                private var _tween:Tween;



                //formats

                private var _titleFormat:TextFormat;

                private var _contentFormat:TextFormat;



                /* check for format override */

                private var _titleOverride:Boolean = false;

                private var _contentOverride:Boolean = false;



                //defaults

                private var _defaultWidth:Number = 200;//宽

                private var _buffer:Number = 10;//四周留白数

                private var _align:String = "right";//箭头位置

                private var _cornerRadius:Number = 4;//圆角度数

                private var _bgColors:Array = [0xFFF4E1,0xFFF4E1];

                //private var _bgColors:Array = [0xB5FEB4,0x003300];//背景色

                private var _autoSize:Boolean = false;//自动调整大小

                private var _hookEnabled:Boolean = true;//有无箭头

                //private var _delay:Number = 0;  //延迟出现毫秒数,已精简

                private var _hookSize:Number = 10;//箭头大小



                //offsets

                private var _offSet:Number;

                private var _hookOffSet:Number;





                public function ToolTip():void

                {

                        //do not disturb parent display object mouse events

                        this.mouseEnabled = false;

                        this.buttonMode = false;

                        this.mouseChildren = false;

                        //setup delay timer

                        /*_timer = new Timer(this._delay, 1);

                                    _timer.addEventListener("timer", timerHandler);*/

                        this.animate(true);

                }



                public function show( p:DisplayObject, title:String, content:String=null ):void

                {

                        //get the stage from the parent

                        this._stage = p.stage;

                        this._parentObject = p;



                        this.addCopy( title, content );

                        this.setOffset();

                        this.drawBG();

                        this.bgGlow();



                        //initialize coordinates

                        var parentCoords:Point = new Point(_parentObject.mouseX,_parentObject.mouseY);

                        var globalPoint:Point = p.localToGlobal(parentCoords);

                        this.x = globalPoint.x + this._offSet;

                        this.y = globalPoint.y - this.height - 10;



                        this.alpha = 0;

                        this._stage.addChild( this );

                        this._parentObject.addEventListener( MouseEvent.MOUSE_OUT, this.onMouseOut );

                        //removed mouse move handler in lieu of enterframe for smoother movement;

                        //this._parentObject.addEventListener( MouseEvent.MOUSE_MOVE, this.onMouseMovement );



                        this.follow( true );

                        //_timer.start();

                }



                public function hide():void

                {

                        this.animate( false );

                }



                /*private function timerHandler( event:TimerEvent ):void {

                this.animate(true);

                }*/



                private function onMouseOut( event:MouseEvent ):void

                {

                        event.currentTarget.removeEventListener(event.type, arguments.callee);

                        this.hide();

                }



                private function follow( value:Boolean ):void

                {

                        if (value)

                        {

                                addEventListener( Event.ENTER_FRAME, this.eof );

                        }

                        else

                        {

                                removeEventListener( Event.ENTER_FRAME, this.eof );

                        }

                }



                private function eof( event:Event ):void

                {

                        this.position();

                }



                private function position():void

                {

                        var speed:Number = 3;

                        var parentCoords:Point = new Point(_parentObject.mouseX,_parentObject.mouseY);

                        var globalPoint:Point = _parentObject.localToGlobal(parentCoords);

                        var xp:Number = globalPoint.x + this._offSet;

                        var yp:Number;

                        if ((_hookEnabled &&globalPoint.y>this.height) || (!_hookEnabled &&globalPoint.y>this.height+10))

                        {

                                yp = globalPoint.y - this.height - 10;

                                if (! _hookEnabled)

                                {

                                        _hookEnabled = true;

                                        this.graphics.clear();

                                        drawBG();

                                }

                        }

                        else if (stage.stageHeight/2>this.height)

                        {

                                yp = globalPoint.y + 25;

                                if (_hookEnabled)

                                {

                                        _hookEnabled = false;

                                        this.graphics.clear();

                                        drawBG();

                                }

                        }

                        var overhangRight:Number = this._defaultWidth + xp;

                        if (overhangRight > stage.stageWidth)

                        {

                                xp = stage.stageWidth - this._defaultWidth;

                        }

                        if (xp < 0)

                        {

                                xp = 0;

                        }

                        if (yp < 0)

                        {

                                yp = 0;

                        }

                        this.x += ( xp - this.x ) / speed;

                        this.y += ( yp - this.y ) / speed;

                }



                private function addCopy( title:String, content:String ):void

                {

                        if (! this._titleOverride)

                        {

                                this.initTitleFormat();

                        }

                        var titleIsDevice:Boolean = this.isDeviceFont(_titleFormat);



                        this._tf = this.createField(titleIsDevice);

                        this._tf.htmlText = title;

                        this._tf.setTextFormat( this._titleFormat);

                        //this._tf.setTextFormat( this._titleFormat, 0, title.length );

                        if (this._autoSize)

                        {

                                this._defaultWidth = this._tf.textWidth + 4 + ( _buffer * 2 );

                        }

                        else

                        {

                                this._tf.width = this._defaultWidth - ( _buffer * 2 );

                        }



                        this._tf.x = this._tf.y = this._buffer;

                        this.textGlow( this._tf );

                        addChild( this._tf );

                        if (content != null)

                        {

                                if (! this._contentOverride)

                                {

                                        this.initContentFormat();

                                }

                                //check for device font

                                var contentIsDevice:Boolean = this.isDeviceFont(_contentFormat);

                                this._cf = this.createField(contentIsDevice);

                                this._cf.htmlText = content;

                                var bounds:Rectangle = this.getBounds(this);

                                this._cf.x = this._buffer;

                                this._cf.y = bounds.height + 5;

                                this.textGlow( this._cf );

                                this._cf.setTextFormat( this._contentFormat );

                                if (this._autoSize)

                                {

                                        var cfWidth:Number = this._cf.textWidth + 4 + ( _buffer * 2 );

                                        this._defaultWidth = cfWidth > this._defaultWidth ? cfWidth:this._defaultWidth;

                                }

                                else

                                {

                                        this._cf.width = this._defaultWidth - ( _buffer * 2 );

                                }

                                addChild( this._cf );

                        }

                }



                //create field, if not device font, set embed to true

                private function createField( deviceFont:Boolean ):TextField

                {

                        var tf:TextField = new TextField();

                        tf.embedFonts = ! deviceFont;

                        tf.gridFitType = "pixel";

                        //tf.border = true;

                        tf.autoSize = TextFieldAutoSize.LEFT;

                        tf.selectable = false;

                        if (! this._autoSize)

                        {

                                tf.multiline = true;

                                tf.wordWrap = true;

                        }

                        return tf;

                }



                //draw background, use drawing api if we need a hook

                private function drawBG():void

                {

                        var bounds:Rectangle = this.getBounds(this);

                        var fillType:String = GradientType.LINEAR;

                        //var colors:Array = [0xFFFFFF, 0x9C9C9C];

                        var alphas:Array = [1,1];

                        var ratios:Array = [0x00,0xFF];

                        var matr:Matrix = new Matrix();

                        var radians:Number = 90 * Math.PI / 180;

                        matr.createGradientBox(this._defaultWidth, bounds.height + ( this._buffer * 2 ), radians, 0, 0);

                        var spreadMethod:String = SpreadMethod.PAD;

                        this.graphics.beginGradientFill(fillType, this._bgColors, alphas, ratios, matr, spreadMethod);

                        if (this._hookEnabled)

                        {

                                var xp:Number = 0;

                                var yp:Number = 0;

                                var w:Number = this._defaultWidth;

                                var h:Number = bounds.height + ( this._buffer * 2 );

                                this.graphics.moveTo( xp + this._cornerRadius, yp );

                                this.graphics.lineTo( xp + w - this._cornerRadius, yp );

                                this.graphics.curveTo( xp + w, yp, xp + w, yp + this._cornerRadius );

                                this.graphics.lineTo( xp + w, yp + h - this._cornerRadius );

                                this.graphics.curveTo( xp + w, yp + h, xp + w - this._cornerRadius, yp + h );



                                //hook

                                this.graphics.lineTo( xp + this._hookOffSet + this._hookSize, yp + h );

                                this.graphics.lineTo( xp + this._hookOffSet , yp + h + this._hookSize );

                                this.graphics.lineTo( xp + this._hookOffSet - this._hookSize, yp + h );

                                this.graphics.lineTo( xp + this._cornerRadius, yp + h );



                                this.graphics.curveTo( xp, yp + h, xp, yp + h - this._cornerRadius );

                                this.graphics.lineTo( xp, yp + this._cornerRadius );

                                this.graphics.curveTo( xp, yp, xp + this._cornerRadius, yp );

                                this.graphics.endFill();

                        }

                        else

                        {

                                this.graphics.drawRoundRect( 0, 0, this._defaultWidth, bounds.height + ( this._buffer * 2 ), this._cornerRadius );

                        }

                }









                /* Fade In / Out */



                private function animate( show:Boolean ):void

                {

                        var end:int = show == true ? 1:0;

                        _tween = new Tween(this,"alpha",Strong.easeOut,this.alpha,end,.5,true);

                        if (! show)

                        {

                                _tween.addEventListener( TweenEvent.MOTION_FINISH, onComplete );

                                //_timer.reset();

                        }

                }



                private function onComplete( event:TweenEvent ):void

                {

                        event.currentTarget.removeEventListener(event.type, arguments.callee);

                        this.cleanUp();

                }



                /* End Fade */









                /** Getters / Setters */



                public function set tipWidth( value:Number ):void

                {

                        this._defaultWidth = value;

                }



                public function set titleFormat( tf:TextFormat ):void

                {

                        this._titleFormat = tf;

                        if (this._titleFormat.font == null)

                        {

                                this._titleFormat.font = "_sans";

                        }

                        this._titleOverride = true;

                }



                public function set contentFormat( tf:TextFormat ):void

                {

                        this._contentFormat = tf;

                        if (this._contentFormat.font == null)

                        {

                                this._contentFormat.font = "_sans";

                        }

                        this._contentOverride = true;

                }



                public function set align( value:String ):void

                {

                        var a:String = value.toLowerCase();

                        var values:String = "right left center";

                        if (values.indexOf(value) == -1)

                        {

                                throw new Error(this + " : Invalid Align Property, options are: 'right', 'left' & 'center'");

                        }

                        else

                        {

                                this._align = a;

                        }

                }



                /*public function set delay( value:Number ):void {

                this._delay = value;

                this._timer.delay = value;

                }*/



                public function set hook( value:Boolean ):void

                {

                        this._hookEnabled = value;

                }



                public function set hookSize( value:Number ):void

                {

                        this._hookSize = value;

                }



                public function set cornerRadius( value:Number ):void

                {

                        this._cornerRadius = value;

                }



                public function set colors( colArray:Array ):void

                {

                        this._bgColors = colArray;

                }



                public function set autoSize( value:Boolean ):void

                {

                        this._autoSize = value;

                }





                /* End Getters / Setters */







                /* Cosmetic */



                private function textGlow( field:TextField ):void

                {//对显示对象应用发光效果

                        var color:Number = 0x000000;

                        var alpha:Number = 0.2;

                        var blurX:Number = 2;

                        var blurY:Number = 2;

                        var strength:Number = 1;

                        var inner:Boolean = false;

                        var knockout:Boolean = false;

                        var quality:Number = BitmapFilterQuality.HIGH;



                        var filter:GlowFilter = new GlowFilter(color,

                                                          alpha,

                                                          blurX,

                                                          blurY,

                                                          strength,

                                                          quality,

                                                          inner,

                                                          knockout);

                        var myFilters:Array = new Array();

                        myFilters.push(filter);

                        field.filters = myFilters;

                }



                private function bgGlow():void

                {//对显示对象应用发光效果

                        var color:Number = 0x000000;

                        var alpha:Number = 0.40;

                        var blurX:Number = 2;

                        var blurY:Number = 2;

                        var strength:Number = 1;

                        var inner:Boolean = false;

                        var knockout:Boolean = false;

                        var quality:Number = BitmapFilterQuality.HIGH;



                        var filter:GlowFilter = new GlowFilter(color,

                                                          alpha,

                                                          blurX,

                                                          blurY,

                                                          strength,

                                                          quality,

                                                          inner,

                                                          knockout);

                        var myFilters:Array = new Array();

                        myFilters.push(filter);

                        filters = myFilters;

                }



                private function initTitleFormat():void

                {

                        _titleFormat = new TextFormat();

                        _titleFormat.font = "_sans";

                        _titleFormat.bold = true;

                        _titleFormat.size = 16;

                        _titleFormat.color = 0x01430E;

                }



                private function initContentFormat():void

                {

                        _contentFormat = new TextFormat();

                        _contentFormat.font = "_sans";

                        _contentFormat.bold = false;

                        _contentFormat.size = 14;

                        _contentFormat.color = 0x000000;

                }



                /* End Cosmetic */







                /* Helpers */



                /* Check if font is a device font */

                private function isDeviceFont( format:TextFormat ):Boolean

                {

                        var font:String = format.font;

                        var device:String = "_sans _serif _typewriter";

                        return device.indexOf( font ) > -1;

                        //_sans

                        //_serif

                        //_typewriter

                }



                private function setOffset():void

                {

                        switch ( this._align )

                        {

                                case "left" :

                                        this._offSet = - _defaultWidth +  ( _buffer * 3 ) + this._hookSize;

                                        this._hookOffSet = this._defaultWidth - ( _buffer * 3 ) - this._hookSize;

                                        break;



                                case "right" :

                                        this._offSet = 0 - ( _buffer * 3 ) - this._hookSize;

                                        this._hookOffSet = _buffer * 3 + this._hookSize;

                                        break;



                                case "center" :

                                        this._offSet = - ( _defaultWidth / 2 );

                                        this._hookOffSet =  ( _defaultWidth / 2 );

                                        break;



                                default :

                                        this._offSet = - ( _defaultWidth / 2 );

                                        this._hookOffSet =  ( _defaultWidth / 2 );

                                        break;

                        }

                }



                /* End Helpers */







                /* Clean */



                private function cleanUp():void

                {

                        this._parentObject.removeEventListener( MouseEvent.MOUSE_OUT, this.onMouseOut );

                        this.follow( false );

                        this._tf.filters = [];

                        this.filters = [];

                        removeChild( this._tf );

                        this._tf = null;

                        if (this._cf != null)

                        {

                                this._cf.filters = [];

                                removeChild( this._cf );

                        }

                        this.graphics.clear();

                        parent.removeChild( this );

                }



                /* End Clean */



        }

}

 

分享到:
评论

相关推荐

    MFC_ToolTip超级类(可以实现各种类型的ToolTip的弹出)

    标题“MFC_ToolTip超级类”指的是一个专门扩展了MFC原生`CToolTipCtrl`类的自定义类,以实现更丰富的功能,比如创建不同类型的ToolTip。 `ToolTip`控件通常用来提供关于用户界面上各个控件的额外信息,当鼠标悬停在...

    Tooltip

    1. **Tooltip类定义**:定义一个Tooltip类,可能继承自系统提供的基础Tooltip类,或者完全自定义实现。这个类应该包含必要的属性(如Tooltip文本)和方法(如显示、隐藏、设置文本等)。 2. **关联控件**:类中可能...

    VC 简洁的tooltip提示类

    在标题提到的"VC 简洁的tooltip提示类"中,我们可以理解为这是一个专门为VC++开发的自定义类,用于增强或简化对控件(如static、Edit、Button等)添加Tooltip提示的过程。 Tooltip提示通常用于提供额外的信息,当...

    3D地球+自定义tooltip,自定义样式完美显示

    本项目聚焦于“3D地球”这一ECharts的特色功能,结合自定义的tooltip(提示框)来提供更个性化的数据展示效果。 首先,让我们深入了解ECharts 3D地球。ECharts 3D地球是ECharts的一个扩展模块,它允许开发者创建...

    简单 ToolTip 类

    简单 ToolTip 类,可以设置显示位置,自己控制显示或隐藏。

    as3 鼠标提示类ToolTip

    在ActionScript 3 (AS3)中,ToolTip 类是一个用于创建和管理鼠标悬停提示的内置组件。这个类使得开发者可以自定义显示在鼠标指针附近的文本或图形提示,为用户提供更多的上下文信息。在本篇文章中,我们将深入探讨...

    MFC中的tooltip的类

    标题“MFC中的tooltip的类”指的是利用MFC来实现这一功能的相关类和方法。虽然Tooltip在实际应用中非常常见,但对于初学者来说,理解并正确使用它们可能会有些复杂。 首先,我们要了解MFC中的Tooltip类`...

    能够实现多行显示tooltip的类

    标题中的“能够实现多行显示tooltip的类”指的是在编程中创建的一种自定义控件,它扩展了标准的tooltip功能,使其支持显示多行文本。通常,系统默认的tooltip只支持单行显示,但在这个情况下,开发人员可能已经编写...

    as3 tooltip的例子

    在描述中提到的“一个tooltip类,表示一个长方形的小弹出窗口”,实际上就是在创建一个自定义的Tooltip类,以便在用户将鼠标悬停在特定的舞台对象(如按钮或图形)上时显示相关信息。 创建自定义Tooltip类的步骤...

    MFC示例:ToolTip的使用.rar

    - `CToolTipCtrl`类提供了多种方法来定制ToolTip的外观和行为,如`SetTipBkColor`和`SetTipTextColor`可以改变提示背景和文字颜色。 - `SetMaxTipWidth`可以设置最大宽度,`SetDelayTime`可以调整显示和消失的延迟...

    表格单元格自定义ToolTip组件

    1. 创建新的ToolTip类:继承自Adobe Flex的基础ToolTip类,或者使用IFeedback接口来创建自定义反馈组件。 2. 配置显示内容:根据需求,可以将内容动态生成,也可以预先设定,如使用数据绑定将单元格数据与ToolTip...

    带有tooltip的ClistCtrl类

    实现带有tooltip的ClistCtrl类,我们需要完成以下步骤: 1. **创建自定义ClistCtrl类**: 首先,我们需要创建一个继承自ClistCtrl的自定义类,例如CToolTipListCtrl。在这个新类中,我们将重写一些必要的成员函数...

    VB ToolTip气泡提示类

    在VB(Visual Basic)编程环境中,创建自定义的ToolTip类是一项常见的需求,特别是在设计用户界面时,为了提供更丰富的交互体验。"VB ToolTip气泡提示类"是针对这一需求的解决方案,它允许开发者实现多行显示、...

    很酷的tooltip信息显示控件源码

    文件名为"InfoBar",这可能是指控件的一个组件或者特定的类,比如一种信息展示栏,可能与tooltip控件有关,用于展示更详细的信息,或者作为tooltip的一种扩展形式。 **详细知识点** 1. **Tooltip基础概念**:...

    WXA-ToolTip-微信小程序-ToolTip信息提示组件.zip

    微信小程序-ToolTip信息提示组件导入将ToolTip文件夹复制到pages文件夹内使用在需要使用ToolTip的页面对应的.wxml文件中添加: src="../ToolTip/toolTip.wxml"/&gt; &lt;!-- 引入toolTip模板 --&gt;  is=...

    winform 自定义tooltip

    在实际使用中,你可以通过实例化这个自定义Tooltip类,然后绑定到控件,设置相应的属性(如标题、内容、图标等),并调用显示方法,即可在你的应用程序中看到这个功能强大的自定义提示工具。如果在使用过程中遇到...

    tooltip

    在IT行业中,"tooltip"是一个常见的交互元素,主要用于在用户将鼠标悬停在特定元素上时显示额外的信息。这个压缩包文件包含了一些关于tooltip实现的基本资源,如样式表(tooltip.css),HTML页面(tooltip.htm),...

    支持TOOLTIP的COMBOX

    同时,需要掌握.NET Framework中的TOOLTIP类,了解如何创建和配置TOOLTIP实例,以及如何动态地设置和显示TOOLTIP的内容。 总的来说,这个资源包提供了一个C#环境下带有TOOLTIP支持的COMBOBOX控件实现,虽然存在一些...

    vc中tooltip应用

    首先,我们需要在资源视图中添加一个Tooltip控件,然后在类视图中关联一个`CToolTipCtrl`成员变量。接着,在对话框初始化函数(如`OnInitDialog`)中,使用`CToolTipCtrl::Create`创建并初始化Tooltip,并通过`...

    带有图像的ToolTip显示功能

    例如,在Windows应用程序开发中,可能需要用到.NET Framework的WinForms或WPF,通过自定义控件或扩展系统提供的ToolTip类来实现。在Web开发中,可以使用HTML5、CSS3和JavaScript(例如jQuery UI或Bootstrap的Tooltip...

Global site tag (gtag.js) - Google Analytics