垂直和水平移动的不同MOUSE_OUT行为?

时间:2010-01-13 20:23:57

标签: flash actionscript-3

显然,

MOUSE_OUT事件在离开Sprite时对X和Y鼠标移动的处理方式不同。

如何修复此问题或解决此问题?这在哪里记录?

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会出现相同的错误行为。

2 个答案:

答案 0 :(得分:1)

“修复”此行为的一种方法是创建一个Sprite的子类,该子类侦听其所有MOUSE_MOVE,MOUSE_OUT和MOUSE_ENTER事件。在检查每个事件时,确定是否让它正常传播,完全停止或调度与您期望的行为相匹配的新类型事件应该相对简单。

例如,可以监听MOUSE_MOVE,如果y == 0,则调度新的MOUSE_OUT事件(如果y == - 1,则阻止任何后续冗余事件)。

答案 1 :(得分:0)

我不是专家,但看起来像是一些bug,我也尝试过ROLL_OVER,做同样的事情,也是一个值得注意的事情,如果你把盒子放在0,0上有一个小的1px边框舞台的顶部,当它超过它时也显示为-1。