2010-01-13 58 views
2

MOUSE_OUT显然,离开Sprite时X和Y鼠标移动的处理方式不同。垂直和水平移动的不同MOUSE_OUT行为?

我该如何解决这个问题或者解决它?这在哪里记录?

MOUSE_OUT时发生x==0,但不是y==0(你需要去y==-1):

private var _sp:Sprite; 

public function test():void 
{ 
    stage.align = StageAlign.TOP_LEFT; 
    stage.scaleMode = StageScaleMode.NO_SCALE; 

    _sp = new Sprite(); 
    _sp.graphics.beginFill(0xFF0000, 1); 
    _sp.graphics.drawRect(0, 0, 15, 15); 
    _sp.graphics.endFill(); 
    _sp.x = 10; 
    _sp.y = 10; 
    _sp.alpha = 1; 

    addChild(_sp); 

    _sp.addEventListener(MouseEvent.MOUSE_MOVE, msMvCb, false, 0, true); 
    _sp.addEventListener(MouseEvent.MOUSE_OUT, msOutCb, false, 0, true); 
} 

private function msMvCb(evt:MouseEvent):void 
{ 
    traceMousePos("mv", evt); 
    _sp.alpha = 1; 
} 

private function msOutCb(evt:MouseEvent):void 
{ 
    traceMousePos("out", evt); 
    _sp.alpha = .5; 
} 

private function traceMousePos(note:String, evt:MouseEvent):void 
{ 
    trace(note + " -- " + evt.localX + ", " + evt.localY + ", " + evt.stageX + ", " + evt.stageY); 
} 

这里是直线向上移动,与MOUSE_OUT在-1痕迹......

mv -- 7, 3, 17, 13 
mv -- 7, 2, 17, 12 
mv -- 7, 1, 17, 11 
mv -- 7, 0, 17, 10 
out -- 7, -1, 17, 9 

这里是一条直线向左移动的轨迹,MOUSE_OUT在0 ...

mv -- 3, 7, 13, 17 
mv -- 2, 7, 12, 17 
mv -- 1, 7, 11, 17 
out -- 0, 7, 10, 17 

编辑

与MOUSE_ENTER会发生同样的错误行为。

回答

0

我不是专家,但看起来像一些错误,我也试着用ROLL_OVER也做同样的事情,也作为一个明显的事情,如果你把框放在0,0有一个小的1px边框舞台的顶部,当它在上面时也显示为-1。

+0

是的,这种错误的行为也发生在ROLL_OVER上,但我无法重现您描述的视觉效果。 – jedierikb 2010-03-02 02:10:25

1

“修复”这种行为的一种方法是让Sprite的子类侦听它的所有MOUSE_MOVE,MOUSE_OUT和MOUSE_ENTER事件。在检查每个事件时,决定是否让它像平常一样传播,完全停止它,或派发一种符合你想要的行为的新类型的事件应该是相对直接的。例如,可以侦听MOUSE_MOVE,并且如果y == 0,则分派新的MOUSE_OUT事件(并且如果y == -1则阻止任何后续的冗余事件)。

+0

这是一个好主意,但是...当mouseY == 0时,鼠标仍然在视觉上在精灵中。捕获并调用我自己的mouseOut然后可能会在技术上解决此问题,但视觉行为将关闭。 – jedierikb 2010-03-02 02:50:45