2011-09-24 10 views
5

이전 질문은 저를 생각하게했습니다. MouseEvent.CLICK를 시뮬레이트하여 MOUSE_DOWN 다음에 MOUSE_UP을 먼저 실행하여 해고 당할 수 있습니까?마우스를 사용하여 마우스 클릭을 시뮬레이션 할 수 있습니까?

Adobe의 doumentation에 따라. "... 클릭 이벤트가 발생하려면이 일련의 이벤트를 항상 발생 순서대로 따라야합니다 : mouseDown 이벤트와 mouseUp이 두 이벤트에 대해 대상 개체가 동일해야하며, 그렇지 않으면 click 이벤트는 발생하지 않습니다. mouseDown 또는 mouseUp 이벤트 사이에서 언제든지 다른 많은 마우스 이벤트가 발생할 수 있으며 click 이벤트는 계속 발생합니다. " http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

내 테스트에서 CLICK 이벤트가 ActionScript 3 이벤트 큐에서 생성되지 않았 음을 보여줍니다. 아니면 코드에 문제가 있습니까?

참조 :

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 

[SWF(backgroundColor="0xFFFFFF", frameRate="30", width="800", height="600")] 

public class Test extends Sprite 
{ 
    private var spr:Sprite = new Sprite(); 
    public function Test() 
    { 
     trace("Test()"); 
     this.addEventListener(Event.ADDED_TO_STAGE,init); 
    } 
    public function init(e:Event):void 
    { 
     trace("init()"); 
     spr.graphics.beginFill(0xFF0000); 
     spr.graphics.drawRect(0,0,200,80); 
     spr.graphics.endFill(); 
     addChild(spr); 
     addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     spr.addEventListener(MouseEvent.CLICK, onClick); 
    } 
    private var tick:int = 0; 
    private function onEnterFrame(e:Event):void 
    { 
     if (tick == 1) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN,true,false)); 
     if (tick == 2) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP,true,false)); 
     if (tick == 3) spr.dispatchEvent(new MouseEvent(MouseEvent.CLICK,true,false)); 
     tick++; 
    } 
    private function onClick(e:MouseEvent):void 
    { 
     trace("onClick() MouseEvent.CLICK dispatched"); 
    } 
} 
} 

내가 대신 하나의 이벤트 ')의 onclick ('TWO을 얻어야한다.

+3

네가 맞아. MOUSE_DUP 다음에 MOUSE_UP이 표시 될 때 새 CLICK 이벤트를 만들지 않습니다 (아마 이벤트 루프 코드에서 그렇게하는 것이 이상하고 마우스 입력 처리 코드에서 이벤트를 생성하는 것이 훨씬 자연 스럽기 때문일 수 있습니다). 수동으로 세 가지 모두 실행해야합니다. 나는이 문서가 일반적인 마우스 이벤트를 언급하고 있다고 생각한다. 수동으로 실행하면 이벤트 주문을 시행하는 특수 코드가있는 것 같지 않습니다. – Cameron

+1

설명서가 혼란스러운 원인과 결과라고 생각합니다. 클릭 이벤트는 마우스에서 아래로 마우스를 올려 놓은 상태에서 동일한 객체에 생성됩니다. 결과적으로 세 가지 ActionScript 이벤트가 모두 전달됩니다. 런타임은 ActionScript 이벤트 자체를 사용하여 click 이벤트를 전달할지 여부를 결정하지 않습니다. –

답변

3

세 가지 유형 모두가 플러그인에 의해 만들어지고 서로 종속되지 않는다는 이유는 없습니다.

MouseEvent.MOUSE_DOWN은 대화 형 개체를 누르면 바로 시작됩니다. MouseEvent.MOUSE_UP은 마우스를 놓자 마자 바로 시작되며, 같은 InteractiveObject 내에서 MOUSE_DOWN을 시작한 마우스 클릭에 의존하지 않습니다. MouseEvent.CLICK는 두 이벤트가 마우스 커서와 마우스 커서 사이에있는 개체를 벗어나는 동일한 개체에서 발생하는 경우에만 발생합니다.

MOUSE_DOWN 및 MOUSE_UP이 모두 실행되지만 이벤트가 CLICK이 아니기 때문에 CLICK이 호출되지 않는 간단한 경우 또는 2 개의 짝수가 있음을 알 수 있습니다.

또한 단순히 MouseEvent.CLICK 이벤트를 전달할 수 있으므로 하나만 호출하면 여러 마우스 이벤트가 발생하여 가짜 사용자 상호 작용을 만들 필요가 없습니다. moue up이 클릭을 트리거해야하는지 확인하기 위해 마우스 다운 리스너에서 클릭 한 각 객체를 추적해야하는 것은 어색합니다. ROLL_OUT 이벤트가 발생하면 참조를 제거해야합니다.

요약하면 CLICK 이벤트는 실제로 MOUSE_DOWN 및 MOUSE_UP 이벤트보다 훨씬 많습니다. 또한 객체를 떠나지 않고 동일한 표시 객체에서 연속적으로 발생하는 이벤트를 관리합니다. 그런 일이 발생하면 플래시가 CLICK 이벤트를 전달합니다.

2

이 불가능,이 코드 :

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.events.MouseEvent; 

    /** 
    * ... 
    * @author www0z0k 
    */ 
    public class Main extends Sprite { 

     public function Main():void { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      stage.addEventListener(MouseEvent.CLICK, onClick); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown); 
     } 

     private function onStageKeyDown(e:KeyboardEvent):void { 
      trace('pressed'); 
      stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)); 
      stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));   
      stage.dispatchEvent(new MouseEvent(MouseEvent.CLICK));   
     } 

     private function onClick(e:MouseEvent):void{ 
      trace('clicked'); 
     }  
    } 
} 

출력은 : 키가 키보드

+0

Oooo, 나는 그것을 좋아한다. if (stage) ... – eLouai

+0

나는 왜 그런지 궁금하다. 그들이 그렇게 할 것이라고 생각할 것이다. 자체 이벤트를 사용하는 것과는 대조적으로 CLICK 이벤트를 구성하는 시스템 환경보다 사용하기 때문입니다. – eLouai

+0

'EventDispatcher' 밖에서'Event'를 보낼 가능성이 없습니다. 가능한 경우 피하십시오. 개발자가 메뉴의 첫 번째 버튼을 활성화하기 위해 클릭을 "가짜"로 만들고 싶을 때 사용했지만, 내부에서 전달하는 함수를 작성하는 것을 선호합니다. – Mattias

0

있는지 여부에 누른 후


을 클릭 누르면 플래시에 대해서. 하지만 창문을 배울 때 MFC와 우둔했다. 내가 한 일은 짧은 지연 후 WM_MOUSEUP에 이어 WM_MOUSEDOWN을 보냈다는 것입니다. 그것은 효과가 있었고 버튼의 시각 상태도 변경되었습니다 - 마우스 클릭없이!

0

내가 무엇을 묻고 있는지 이해한다면 대답은 '예'입니다.

특히 코드를 읽은 후 여기에서 솔루션을 단순화했다면 궁금합니다. 마우스 클릭을 "시뮬레이트"하는 것은 매우 간단합니다. 아래 코드는 개체를 클릭 할 때 두 번 클릭 한 문을 출력하고 마우스를 아래로 움직여 개체 경계 밖으로 이동할 때 아무 것도 클릭하지 않습니다.

이 클래스는 무대에서 만든 무비 클립을 확장하여 상자를 코딩 할 필요가 없었습니다. 결코 두 - 코드에서

package { 

import flash.display.MovieClip; 
import flash.events.MouseEvent; 


public class clickMe extends MovieClip { 


    public function clickMe() { 
     // constructor code 

     this.addEventListener(MouseEvent.CLICK, clicked); 
     this.addEventListener(MouseEvent.MOUSE_DOWN, mDown); 

    } 

    private function clicked(e:MouseEvent):void{ 
     trace("I have been clicked"); 
     this.removeEventListener(MouseEvent.MOUSE_UP, clicked); 
    } 

    private function mDown(e:MouseEvent):void{ 
     this.addEventListener(MouseEvent.MOUSE_UP, clicked); 
    } 
} 
} 

나는 문제는 당신이 오직 프레임 당 하나 개의 이벤트를 해고 것 "onEnterFrame과"을 통해 청취자가 전달 이벤트를 실행하려고하는 것입니다 생각합니다. 또한 코드를 테스트 한 후에는 "틱"변수로 재설정하려고 시도한 것이 무엇인지 확실하지 않습니다. 따라서 MOUSE_UP 이벤트는 한 번 발생합니다 (틱 = 2 일 때 마우스를 누르고 있지 않은 경우). 다른 디스패치 중 아무 것도 다시 실행되지 않습니다.

0

왜 모두가 이러한 복잡한 스파이크를 만들고 있는지 잘 모르겠습니다. 또는 어쩌면 나는 다만 무언가를 감독하고있다.

어쨌든, 여기를 확인하는 아주 쉬운 방법이있다 :

import flash.events.MouseEvent; 

stage.addEventListener(MouseEvent.CLICK, function(){ 
    trace('clicked'); 
}); 

stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)); 
stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP)); 

을 그 대답이 될 것이다, 는 "아니, 그것은 불가능"...

... 아마도 다음과 같은 질문에 대한 답이 있어야합니다. 왜 마우스를 클릭하여 mousedown과 mouseup을 사용하여 클릭 이벤트를 시뮬레이트하고 싶습니까?

실종 위기가 있습니까?

아니면 단순한 호기심에 관한 질문입니까? 하지만 고양이에게 무슨 일이 있었는지 알겠군요. 맞아요.하지만 슈뢰딩거의 고양이 일 수도 있습니다.이 무의미한 사고 방식의 끝에서, 호기심은 정말로 고양이를 죽이고 죽이지 않았 음을 의미합니다.

고양이가 상자 밖에있는 경우를 제외하고.

그러면 아마도 낭비 일 것입니다.

상자 밖으로 생각하면 죽을 수도 있습니다.

관련 문제