2

私はActionScript 3 でマウス イベントを再ディスパッチしようとして問題に遭遇しました。表示されるメソッドに絞り込みましたがMouseEvent.clone()、まあ、完全に壊れています。次のイベント ハンドラー:

    private function handleMouseMove( evt : MouseEvent ) : void
    {
        trace("mousemove", evt.stageX, evt.stageY);
        var newEvt : MouseEvent = evt.clone() as MouseEvent;
        trace("mousemoveclone", newEvt.stageX, newEvt.stageY);
    } 

次の出力が無限に出力されます。

mousemove 167 206 
mousemoveclone 0 0

これは、MouseEvent を再ディスパッチしたコードが受け取っていたものと一致するため、クローン機能が壊れているという私の仮説です。

これは、何かを見逃していない限り、リンクされたドキュメントが示すこととは正反対です。この動作を引き起こす可能性のある何をしたか (またはしなかったか) について、私は完全に途方に暮れています。AS3 の人たちは、自分たちのドキュメントを読むのを本当に忘れていたのEvent.clone()でしょうか?

特定のユースケースでは代わりに関数オブジェクトを使用することでこれを回避できますが、そうしないことを好みます。何か案は?

編集: localX および localY メンバーは適切に複製されているようです。これにより、ここで何が起こっているかについてさらに途方に暮れます。

4

3 に答える 3

3

それは既知のバグです。バグ レポートは、http: //bugs.adobe.com/jira/browse/FP-343で確認できます。

ただし、それ以外はすべて複製する必要があります。バグが修正されるまでは、いつでも手動で stageX と stageY を割り当てることができます。

于 2009-04-08T00:21:24.570 に答える
2

このスレッドが 7 か月間休眠していることは認識していますが、これを少し更新するだけです。これは FP10 と Flex4 でまだアクティブです。イベントを再ディスパッチした場合にも発生します。すなわち:

private function mouseListener( e:MouseEvent ):void
{
    dispatchEvent( e );
}

その dispatchEvent() 呼び出しは clone() と同等のように見えるため、stageX と stageY は 0 に設定されます

于 2009-11-27T16:50:02.377 に答える
0

これはかなり古い質問ですが、Googleで解決策を探したときに出てきたものであり、ここにあるものは十分に包括的ではありません.

これが「修正」されていない理由は、意図したとおりに機能しているためです。イベントのターゲットを使用して localToGlobal 変換を行い、getter を呼び出すと、stageX と stageY の値が計算されます。これは、イベントが送出されてからターゲット オブジェクトの位置、スケール、または回転が変更された場合でも、数値が正しく維持されるようにするために必要です。

正しい stageX および stageY 値で MouseEvent を再ディスパッチする必要がある場合の 2 つのオプションは次のとおりです。

  1. stageX および stageY ゲッターをオーバーライドする MouseEvent のカスタム サブクラスを作成します。元のターゲットを保存して localToGlobal の計算を自分で実行するか、元のイベントのクローンを作成したときに存在する値を使用して、stageX と stageY の静的値を保存できます。

  2. Sprite を拡張し、ディスパッチャをステージに追加して、ストックの MouseEvent が適切に機能するようにします。

于 2013-03-10T23:44:19.140 に答える