MouseEvent.ROLL_OVER和MouseEvent.MOUSE_OVER的区别

在MouseEvent中,ROLL_OVERMOUSE_OVERROLL_OUTMOUSE_OUT 是两对比较相似的事件,它们有什么区别呢?AS3语言参考中是这样解释的:

rollOver 事件的目的是简化带有子级的显示对象容器的移开行为的编码。 当鼠标进入某个显示对象区域或者从其子级以外的对象进入任何其子级区域时, 该显示对象将分派 rollOver 事件。这种行为与 mouseOver 事件的行为不同, 每次鼠标进入显示对象容器的任何子对象区域时都会分派此事件, 即使鼠标已在显示对象容器的另一个子对象上也是如此。

解释得有些拗口,实际上简单说就是: ROLL_OVER 事件无视子对象,只监听根对象的事件。

看了下面演示,就更清楚了。

请使用下面的链接升级 Flash Player 到最新版本:

安装最新的Flash Player插件

源码:

 1package
 2{
 3    import flash.display.Sprite;
 4    import flash.events.MouseEvent;
 5    import flash.text.TextField;
 6    
 7    [SWF(width=350,height=400)]
 8    public class SimpleSample9 extends Sprite
 9    {
10        private var _spriteChild:Sprite;
11        private var _spriteParent:Sprite;
12        private var _tf:TextField;
13        private var _line:int=0;
14        
15        public function SimpleSample9()
16        {
17            _spriteChild = new Sprite();
18            _spriteChild.name = 'child';
19            _spriteChild.graphics.beginFill(0x81ADF0);
20            _spriteChild.graphics.drawCircle(0, 0, 40);
21            _spriteChild.graphics.endFill();
22            
23            _spriteParent = new Sprite();
24            _spriteParent.name = 'parent';
25            _spriteParent.graphics.beginFill(0x0000ff);
26            _spriteParent.graphics.drawCircle(0,0, 90);
27            _spriteParent.graphics.endFill();
28            
29            _spriteParent.addChild(_spriteChild);
30            addChild(_spriteParent);
31            _spriteParent.x = stage.stageWidth/2;
32            _spriteParent.y = _spriteParent.height/2;
33            
34            _tf = new TextField();
35            _tf.border = true;
36            _tf.width = stage.stageWidth;
37            _tf.height = stage.stageHeight-_spriteParent.y-_spriteParent.height/2;
38            _tf.y = stage.stageHeight - _tf.height;
39            addChild(_tf);
40            
41            _spriteParent.addEventListener(MouseEvent.MOUSE_OVER, mouseHandler);
42            _spriteParent.addEventListener(MouseEvent.MOUSE_OUT, mouseHandler);
43            _spriteParent.addEventListener(MouseEvent.ROLL_OVER, mouseHandler);
44            _spriteParent.addEventListener(MouseEvent.ROLL_OUT, mouseHandler);  
45        }
46        
47        private function mouseHandler(evt:MouseEvent):void
48        {
49            _line++;
50            var __ctName:String = evt.currentTarget.name;
51            var __tName:String = evt.target.name;
52            var __rName:String = evt.relatedObject == null ? 'null' : evt.relatedObject.name;
53            _tf.text = _line.toString()+','+(evt.type+',currentTarget:'+__ctName+',target:'+__tName+',relatedObject:'+__rName+'\n') + _tf.text;
54        }
55    }
56}