2011-03-25 3 views
0

I가 대부분의 것들에 대한 좋은 작품을 사용자 정의 드래그 이벤트 :Event.MOUSE_LEAVE을 감지하는 방법 때 W 모드 = 불투명 또는 W 모드 = 투명

stage.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag); 

function beginDrag(e:MouseEvent) 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.addEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.addEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.addEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger beginDrag event 
} 
function drag(e:MouseEvent) 
{ 
    //trigger drag event 
} 
function endDrag(e:Event) 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.removeEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.removeEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.removeEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger endDrag event 
} 

문제는 그 나는 wmode=transparent 또는 wmode=opaque이 코드를 사용할 때 MOUSE_UP 이벤트가 스테이지에서 발생하면 MOUSE_LEAVE 이벤트가 감지되지 않습니다.

wmodetransparent 또는 opaque 일 때 MOUSE_LEAVE 이벤트를 감지하는 방법이 있습니까?

또는

작업이 주위에 구현 될 수 있도록 wmodetransparent 또는 opaque로 설정되어 있는지 감지 할 수있는 방법이 있나요?

답변

0

기본적으로 MOUSE_LEAVE는 신뢰할 수있는 이벤트가 아닙니다. 때때로 그것은 해고 당하고 다른 때에는 그렇지 않을 것입니다. 웹상에 find complaints about this 수 있습니다.

이 당신은하지만, 할 수있는 한 가지이며, 그 마우스가 무대 위에있을 경우 수동으로 확인하는 것입니다 : 커서가 스테이지 영역의 외부에있을 때

var out : Boolean = false; 

stage.addEventListener (Event.ENTER_FRAME, checkMouse); 

function checkMouse (ev:Event) : void { 
    if (
     stage.mouseX < 0 || 
     stage.mouseX > stage.stageWidth || 
     stage.mouseY < 0 || 
     stage.mouseY > stage.stageHeight) 
    { 
     if (!out) 
     { 
      out = true; 
      stage.dispatchEvent (new Event(Event.MOUSE_LEAVE)); 
     } 
    } 
    else if (out) 
    { 
     out = false; 
     stage.dispatchEvent (new Event("mouseEnter")); 
    } 
} 

는 이쪽 MOUSE_LEAVE 이벤트를 전달합니다 , 그리고 커스텀 "mouseEnter"이벤트가 재진입 할 ​​때. 스테이지에 이벤트 리스너를 추가하여 이러한 이벤트에 안정적으로 반응 할 수 있지만 한 번에 둘 이상의 MOUSE_LEAVE가 실행될 수 있습니다 (사용자 정의 이벤트와 기본 이벤트가 모두 실행되는 경우). out 변수를 점검하여 이벤트 핸들러의 이중 실행을 방지 할 수 있습니다.

P. 모든 stage.align 및 stage.scaleMode 옵션에서 이것이 작동하는지 잘 모르겠습니다. 이 설정은 StageScaleMode.NO_SCALE 및 StageAlign.TOP_LEFT를 조합하여 작동해야하며 다른 설정을 확인하고 대안을 찾을 수 있습니다.

+0

@weltraumpirat 'MOUSE_LEAVE' 이벤트가이 전에는 신뢰할 수 없다는 것을 결코 알지 못했습니다. 많은 사람들이'MOUSE_LEAVE' 이벤트가 발생하면 * 사용자가 마우스를 드래그하는 동안 마우스가 스테이지를 떠난 후에 * MOUSE_UP 이벤트가 발생할 때 혼란을 겪습니다. 마우스가'wmode = transparent/opaque'에서 스테이지를 벗어나면 마우스 이벤트가 처리되지 않는다는 것을 발견했습니다. 그래서이 메소드는 작동하지 않을 것입니다. – zzzzBov

+0

문제가 생기면 항상 ENTER_FRAME 리스너를 사용할 수 있습니다. 가능한 경우 MOUSE_MOVE를 사용하는 것을 선호합니다. 자주 해고되지 않기 때문입니다. – weltraumpirat

+0

@weltraumpirat 마우스가 스테이지를 떠날 때 마우스 이벤트가 하나도 발생하지 않습니다 (MOUSE_OUT 이벤트조차도). 마우스가 눌려 지거나 눌려지면, 새로운 마우스 이벤트는'buttonDown'에 대한 올바른 값을 등록하지 않습니다. 'ENTER_FRAME' 리스너가 어떻게 도움이 될지 모르겠습니다. – zzzzBov