周淼(MillsonZhou)的个人博客,记录、收藏、分享

AS3替换鼠标

开发过程中出现这样的需求,当鼠标移动到某一元件上面的时候,将默认鼠标替换为自定义的鼠标(一个元件)

我是这样写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var _cursor:MovieClip = new my_cursor; //my_cursor为自定义的一个元件
_cursor.visible = false;
addChild(_cursor);
_mc.addEventListener(MouseEvent.MOUSE_OVER, onMcOverHandler);
_mc.addEventListener(MouseEvent.MOUSE_OUT, onMcOutHandler);
private function onMcOverHandler(e:MouseEvent):void{
trace("over");
Mouse.hide();
_cursor.visible = true;
_cursor.x = MouseX;
_cursor.y = MouseY;
_cursor.startDrag();
}
private function onMcOutHandler(e:MouseEvent):void{
trace("out");
Mouse.show();
_cursor.visible = false;
_cursor.stopDrag();
}

按理说,应该是没有问题的,可是鼠标老是会闪,trace出的结果是不停的over、out,检查了老半天,觉得代码是没有问题的,难道是元件的问题,直接把_mc对应的元件换成了自己画的一个长方形元件,鼠标也是用的静态的一张图,结果还是闪个不停

又纠结了很长时间,并请教了老大之后,终于得出了一个结论,问题出在自定义的鼠标上面,看下面两张图的对比

old.pngnew.png

当鼠标移动到_mc上面时,触发MOUSE_OVER事件

1
2
_cursor.x = MouseX;
_cursor.y = MouseY;

这两段代码之后将会触发MOUSE_OUT事件,然后在MOUSE_OUT事件中

1
_cursor.visible = false;

这行代码使_cursor被隐藏,再次触发MOUSE_OVER事件,两个事件就这样不停的触发,造成鼠标闪动,为什么会这样?

如果尝试着把Mouse.hide(); 和 Mouse.show(); 这两行代码注释掉的话,你会发现自定义的鼠标还是会闪动

当_cursor移动到鼠标位置的时候,如果你给_cursor加了MOUSE_OVER事件的话,你会发现这个事件被触发了,这下应该懂了吧,系统鼠标就相当于一个隐藏的文件,虽然看不到,但是它还是存在的,当把_cursor移动到鼠标位置的时候,就挡住了_mc,这时必然会触发MOUSE_OUT事件,反之亦然

怎么解决,一种就是通过上面两个图的方法,更改_cursor元件,往原点外偏移一段距离;或者:

1
2
_cursor.x = MouseX ± x;
_cursor.y = MouseY ± x;

只要不挡住系统鼠标就行,但是这种只适合比较大的元件,需要比较精确的定位的话,这种方法可能是行不通的,不知道其他还有什么方法




如果只是需要在整个flash中替换鼠标的话,相对而言就没有这么复杂了

1
2
3
4
5
6
7
8
9
10
var _cursor:MovieClip = new my_cursor;
addChild(_cursor);
Mouse.hide();
stage.addEventListener(MouseEvent.MOUSE_OVER, onStageOverHandler);
private function onStageOverHandler(e:MouseEvent):void{
_cursor.x = MouseX;
_cursor.y = MouseY;
e.updateAfterEvent();
}




文章发布后可能会有修改,修改错误、笔误什么的,一切以三水之都博客下内容为准

返回顶部