2011-09-24 24 views
5

前の質問は私に考えさせてくれました。 MouseEvent.CLICKをシミュレートして、最初にMOUSE_DOWNの後にMOUSE_UPを発射することで起動することは可能ですか?マウスの上下のイベントを使ってマウスのクリックをシミュレートできますか?

アドビのdoumentationに従って。 "...クリックイベントが発生するには、発生した順にこの一連のイベントに常に従わなければなりません:mouseDownイベント、mouseUpこれらのイベントの両方で対象オブジェクトが同一でなければなりません。 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"); 
    } 
} 
} 

私は2つの 'のonClick()' イベントの代わりの1を取得する必要があります。

+3

あなたはそうです。 MOUSE_DUPに続いてMOUSE_UPが表示されたときに新しいCLICKイベントを作成していません(おそらく、イベントループコードでこれを実行するのが非常に奇妙で、マウス入力処理コードでイベントを生成するのが自然であるからです)。あなたは手動で3つのすべてを起動する必要があります。私はドキュメントが通常のマウスイベントを指していたと思います。手動で起動すると、イベントオーダーを実施する特別なコードはありません。 – Cameron

+1

私は文書化が混乱している原因と効果が少しあると思います。クリックイベントは、同じオブジェクト上でマウスの下から上にマウスで生成されます。結果として、3つのActionScriptイベントがすべて送出されます。ランタイムは、ActionScriptイベント自体を使用してクリックイベントを送出するかどうかを判断しません。 –

答えて

3

3つのタイプすべてがプラグインによって作成され、お互いに依存しているわけではありません。

MouseEvent.MOUSE_DOWNは、対話型オブジェクトを押すとすぐに起動されます。 MouseEvent.MOUSE_UPはマウスを離すとすぐに起動され、同じInteractiveObject内でMOUSE_DOWNを開始したマウスクリックには依存しません。 MouseEvent.CLICKは、両方のイベントが同じオブジェクト内で発生し、カーソルがオブジェクトをマウスの下とマウスの上の間に残さない場合にのみ発生します。

MOUSE_DOWNとMOUSE_UPの両方が発生する単純なケースか2つの偶数がありますが、イベントがCLICKではないためCLICKは呼び出されません。

さらにMouseEvent.CLICKイベントを送出するだけで、1つだけ呼び出されたときに複数のマウスイベントを発生させることで、偽のユーザー操作を作成する必要がなくなります。ムーアアップがクリックを引き起こすかどうかを確認するために、マウスダウンリスナーでクリックされた各オブジェクトを追跡する必要があるのは厄介です。また、ROLL_OUTイベントが発生したときに参照を削除する必要があります。

要するに、CLICKイベントは実際にはMOUSE_DOWNイベントとMOUSE_UPイベントよりもはるかに多くなります。また、オブジェクトを離れることなく、連続して同じ表示オブジェクトでイベントが発生したことを管理しています。それが起こると、それが起こったときだけ、Flashは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

わからないに押された後


をクリック押しますフラッシュの場合はこれについて。しかし、私はWindows MFCを学んでいて、無知だった。私がしたことは、短い遅延の後にWM_MOUSEUPに続いてWM_MOUSEDOWNを送信したことでした。それはうまくいき、マウスのクリックなしでボタンの視覚状態も変わりました!

0

私があなたが尋ねていることを理解していれば、答えはYESです。

ここでは特にコードの試行を読んだ後に解決策を簡略化してしまったのか不思議です。マウスクリックを「シミュレート」するのは非常に簡単です。下のコードは、オブジェクトがクリックされたときに2つの「クリックされました」というステートメントを出力します。

このクラスはステージで作成したMovieClipを拡張したので、ボックスをコーディングする必要はありませんでした。決して2を - あなたのコードで

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); 
    } 
} 
} 

私はこの問題は、あなただけのこれまでのフレームごとに1つのイベントを発生させます「onEnterFrame」を通じてリスナーがディスパッチイベントを実行しようとしているということであると信じています。また、あなたのコードをテストした後、あなたは決してそれをリセットしないので、あなたが "tick"変数を使って達成しようとしていたものがわかりません。そのため、MOUSE_UPイベントは一度発生します(tick = 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)); 

そして答えは、だろう「いいえ、それは不可能です」...

...おそらく私はクリックイベントをシミュレートしたいのですが、マウスイベントのシーケンスを使ってクリックイベントをシミュレートしたいのですが、クリックイベントをディスパッチできますか?

私はボタン、存在危機を抱えていますか?

単なる好奇心の質問ですか?しかし、あなたは猫に何が起こったのか知っています...そうです、しかし、おそらくシュレディンガーの猫です。つまり、この完全に無関係な思考の列の終わりに、好奇心は本当に猫を殺していませんでした。

猫が箱から出ている場合を除いて。

それはおそらくちょうど無駄になった。

参照してください、箱から考えて、あなたを殺すことができます。

関連する問題