如何在flex中实现自定义鼠标样式呢?

来源:互联网 发布:软件协议有哪些 编辑:程序博客网 时间:2024/04/29 04:45

如何在flex中实现自定义鼠标样式呢?flex本身提供了一个CursorManager可以用来管理鼠标样式。

比如,我们想把鼠标设置为忙碌状态,首先导入CursorManager包。在你的as代码头部添加:

import mx.managers.CursorManager;

你也可能会用到一些设置鼠标样式优先级的常量:

import mx.managers.CursorManagerPriority;

CursorManager里的方法都是静态的,所以你不必实例化它即可直接调用。在你想设置鼠标为忙碌状态的地方添加如下代码:

CursorManager.setBusyCursor();

当执行完该句时,鼠标就会变成小闹钟的等待样式。

如果你想用自己的图片作为鼠标的样式,首先要嵌入图像的元数据,以便在程序中使用它:

[Embed(source = "cur1.png")]
var curStyle:Class;

然后可以像使用一般的类那样来使用curStyle,新建一个curStyle的实例:

var cursorStyle1:Class= new cur1() ;

将该样式实例设置到鼠标样式:

CursorManager.setCursor(cursorStyle1);

你也可以同时指定该样式的优先级和偏移:

CursorManager.setCursor(cursorStyle1, CursorManagerPriority.HIGH, 5, 5);

CursorManager 类控制一个光标优先顺序列表, 在其中具有最高优先级的光标当前是可见的。 如果光标列表包含具有相同优先级的多个光标, 则光标管理器会显示最近创建的光标。

这样,鼠标就会变成你想要的样子。

不过CursorManger并不好用,虽然他提供了一个currentCursorID属性,但是通过实验发现对该属性进行设置并不能改变鼠标的样式,因为它没有改变鼠标样式的优先级属性,而一个鼠标样式是否显示取决于鼠标样式的优先级是否为最高。flex除了在设置鼠标样式,即setCursor函数中可以指定优先级以外,没有提供其他接口来改变CursorManager中鼠标样式列表中样式的优先级。这样我们就不能随心所欲的去指定我们的鼠标样式,我们需要通过添加和移除鼠标样式来达到我们的目的。

但这样不是很方便,代码看起来也别扭。通过跟踪CursorManager的源码,我们可以发现,CursorManger的基本原理也很简单,就是把原来的鼠标隐藏掉了,然后自己加了一个Sprite对象cursorHolder,在该对象上绘图或者把图片加进去,然后在stage上监听mousemove事件,把cursorHolder的位置设置到鼠标的位置,就实现了自定义鼠标样式。

那我们也可以自己写一个类来管理鼠标样式了。公司的源码,虽然是自己写的,还是不敢乱贴。类的代码就不发了,我就给个示例好了。根据这个原理,可以自己去实现。

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   
               xmlns:s="library://ns.adobe.com/flex/spark"   
               xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
    <s:layout>
        <s:BasicLayout/>
    </s:layout>

    <fx:Script>
        <!--[CDATA[  
            import mx.core.BitmapAsset;   
            // 自定义的鼠标元素  
            var myCursor:Sprite = new Sprite();  
            protected function button1_clickHandler(event:MouseEvent):void  
            {                 
                // 嵌入图像元数据  
                [Embed(source = "cur1.png")]  
                var cur1:Class;  
                // 把图片设置到自己的鼠标元素上去  
                var cursorStyle1:BitmapAsset = new cur1() as BitmapAsset;  
                myCursor.addChild(cursorStyle1);  
                // 添加stage的mousemove监听器  
                stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemoveHandler);  
                // 添加sprite对象并隐藏鼠标  
                stage.addChild(myCursor);  
                Mouse.hide();  
            }  
            // 监听函数  
            protected function mousemoveHandler(event:MouseEvent):void  
            {  
                myCursor.x = event.stageX;  
                myCursor.y = event.stageY;  
            }  
        ]]-->
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button x="274" y="177" label="按钮" click="button1_clickHandler(event)"/>
</s:Application>

原创粉丝点击