2010-01-13 2 views
2

MOUSE_OUT события, очевидно, обрабатываются по-разному для перемещения 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

1

Одним из способов «исправления» этого поведения является создание подкласса Sprite, который прослушивает все события MOUSE_MOVE, MOUSE_OUT и MOUSE_ENTER. При изучении каждого события должно быть относительно просто решить, разрешить ли он распространяться как обычно, полностью остановить его или отправить новый тип событий, который соответствует вашему желаемому поведению.

Например, можно прослушать MOUSE_MOVE, а если y == 0, отправьте новое событие MOUSE_OUT (и заблокируйте любые последующие избыточные события, если y == - 1).

+0

Это хорошая идея, однако ... когда mouseY == 0, мышь все еще визуально находится в спрайте. Захват и вызов моей собственной мыши. Тогда можно технически обойти это, но визуальное поведение будет отключено. – jedierikb

Смежные вопросы