0

Flex4 でカスタム コンテキスト メニューを作成しています。コンテキスト メニュー自体は正常に動作しますが、ContextMenuEvent の mouseTarget が画像かどうかを確認する方法を探しています。現状では、mouseTarget は「[object MovieClip]」であることを示しています。私のアプリケーションにはムービー クリップがなく、画像コンテナしかないので、これは奇妙です。何が起こっているのですか?

private function openContextMenu(e:ContextMenuEvent):void {
    Alert.show(e.mouseTarget.toString());// shows [object MovieClip] when it should show [Object Image]
}

ありがとう

4

3 に答える 3

0

そのため、さらに数時間の調査の後、contextMenu の項目選択イベント リスナーに以下を添付することにしました。これを行うためのより良い方法が必要だと確信していますが、それまでは...

for(var i:int = 0; i < getObjectsUnderPoint(new Point(this.mouseX, this.mouseY)).length; i++)
{
    if(getObjectsUnderPoint(new Point(this.mouseX, this.mouseY))[i].parent.parent is Image)
    {
        //do what I need to do
    }
}

ご意見をお寄せいただきありがとうございます。それは私が子供たちを見る正しい道を歩ませてくれました。

于 2012-04-25T21:46:17.723 に答える
0

コンポーネント名Imageは、それを構成するものとは関係ありません。Flex の継承は、Image -- SWFLoader -- UIComponent -- FlexSprite -- [...] ( mx.controls.Image docsから) です。

そのため、AS3 環境に持ち込んだときに実際に何を持っているかを理解する必要があります。Flash の表示リストに入れるために MovieClip にラップされているようです。ローダーを通過する必要があるようにも見えますが、それについてはわかりません。

1 つまたは 2 つのテストを実行して、オブジェクトが実際に構成されているものを調べます。

// not foolproof, and will break on some stuff, 
// so you will have to fix this as needed:
private function loopDisplay(obj:Sprite):void
{
    trace(obj.name + ": " + obj);
    if (obj.numChildren > 0)
    {
        for (var i:int = 0; i < this.numChildren; i++)
        {
            loopDisplay(obj.getChildAt(i));
        }
    }
}

これをマウス ダウン ハンドラに入れると、実際に何があるかがわかります。

ただし、event.targetorevent.currentTargetはメニュー項目オブジェクトも保持する必要があるため、これらのオブジェクトにループして、その内容を確認することもできます。

于 2012-04-25T23:49:36.750 に答える
0

Image の mouseChildren を false に設定する必要があります。そうすれば、MouseEvent は Image を参照します。

if (event.target is Image) {
   //do stuff
}
于 2012-04-26T00:31:04.123 に答える