直接显示ToolTip和errorTip(不需要将鼠标移到组件上)

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:直接显示ToolTip和errorTip(不需要将鼠标移到组件上)
  • 本文链接:http://zengrong.net/post/455.htm

在使用mx.validator包的时候,我一直都希望检测没有通过的错误信息能够直接显示出来,而不是等我把鼠标移动到没有通过的组件上再显示。我认为这能带给用户更好的体验。因为用户能在第一时间就知道自己到底填错了什么,况且,并不是所有的用户都知道必须把鼠标移动到出错的组件上才能看到错误信息的。很多用户在控件的边框变红,并且不能够继续提交之后不知所措。(我认为,那个红色并不明显,还不至于让用户知道必须把鼠标移动到组件上去,尤其是在页面中的组件相当多的时候……)

今天翻看Flex 3的帮助,找到了解决的办法。

关键在于ToolTipManager类的使用。使用ToolTipManager类的createToolTip方法可以直接生成一个ToolTip进行显示。语法很简单,只需要指定要显示的文字,x、y值即可。如果坐标值是基于组件的,则需要使用localToGlobal来转换坐标系。

一个有趣的地方是ToolTip的箭头方向。createToolTip的第4个参数是指定箭头。如果为空,就不显示箭头。如果为下面三个字符串值中的一个,则会显示箭头:

  • errorTipAbove
  • errorTipRight
  • errotTipBelow

是的,没有 errorTipLeft。

另一个有趣的地方是关于ToolTip的样式。对于createToolTip生成的ToolTip,可以用ToolTip选择符控制它的样式。但是这还取决于createToolTip的第4个参数。如果这个参数有值,那么就必须使用.errorTip这个css类来控制它的样式了。

.errorTip
{
    font-size: 12;
}

.errorTip会影响Validator的样式,所以,可以重新定义专有样式,并在生成toolTip的时候赋值给它。

.testTip
{
    font-size: 12;
    border-color: #ffffdd;
    color: #ff0000;
    font-weight: bold;
}
_tip.styleName = 'testTip';

createToolTip生成的ToolTip,必须用destoryToolTip来清除。如果在清楚之前再次调用createToolTip,则会生成重复的ToolTip。ToolTipManager有一个currentToolTip属性来保存当前显示的ToolTip,但这个属性对于使用createToolTip创建的ToolTip并没有效果。因此还是老老实实的在生成的时候用变量把它保存下来把。

源码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="400" height="150" horizontalAlign="center" verticalAlign="middle">
    <mx:Style>
        global
        {
            font-size: 12;
            theme-color: haloSilver;            
        }
        Application
        {
            background-color: #dddddd;  
        }
        .errorTip
        {
            font-size: 12;
        }
        .testTip
        {
            font-size: 12;
            border-color: #ffffdd;
            color: #ff0000;
            font-weight: bold;
        }
    </mx:Style>
    <mx:Script>
        <![CDATA[
            import mx.managers.ToolTipManager;
            import mx.controls.ToolTip;

            private var _tip:ToolTip;

            private function _showTip($txt:String):void
            {
                trace(_tip);
                if(_tip == null)
                {
                    var __point:Point = new Point(emailTI.x, emailTI.y);
                    trace(__point)
                    __point = emailTI.localToGlobal(__point);
                    trace(__point);
                     _tip = ToolTipManager.createToolTip(   $txt,
                                                            __point.x - emailTI.x, 
                                                            __point.y - 40 ,
                                                            'errorTipAbove') as ToolTip;
                     _tip.styleName = 'testTip';
                }
            }

            private function _destoryTip():void
            {
                if(_tip)
                {
                    ToolTipManager.destroyToolTip(_tip);
                }
                _tip = null;
            }
        ]]>
    </mx:Script>
    <mx:EmailValidator id="emailV" source="{emailTI}" property="text" trigger="{btn}" triggerEvent="click"/>
    <mx:Form horizontalCenter="0">
        <mx:FormItem label="电子邮件:" width="100%">
            <mx:TextInput id='emailTI' width="100%"/>
        </mx:FormItem>
        <mx:FormItem horizontalAlign="center" width="100%" direction="horizontal">
            <mx:Button id="btn" label="提交"/>
            <mx:Button id='btn2' label="显示Tip" click="_showTip('测试弹出Tip')"/>
            <mx:Button id='btn3' label="取消Tip" click="_destoryTip()"/>
        </mx:FormItem>      
    </mx:Form>
</mx:Application>

范例效果: