0

画像のレイヤーが「リスト」フレックスコンポーネントにリストされているAir/Flexで簡単なプログラムを作成しています。アイデアは、ユーザーがリスト内のエントリをドラッグ、クリック、ダブルクリックなどしてレイヤーを編集できることです。

ただし、AS3 および Flex コンポーネントでイベント バインディングがどのように機能するかは、まだ完全には把握できていないようです。ダブルクリックしたときに、リスト内の1つのエントリのラベルをトレースするプログラムを取得しようとしました。3 つに 1 つのエントリで機能しますが、他のエントリは参照エラー #1069 を返します。以下は、レイヤークラスの関連コードです。

レイヤー パネルとリストの宣言:

<s:Panel x="10" y="29" width="276" height="261" id="newlevel" title="Background layers">
        <s:List  id="layers" x="10" y="41" width="254" height="143" dragEnabled="true" dragMoveEnabled="true" dataProvider="{layerlist}"
                dropEnabled="true" dragComplete="layers_dragCompleteHandler(event)" doubleClickEnabled="true" doubleClick="layers_doubleClickHandler(event)" keyDown="layers_keyDownHandler(event)">

        </s:List>

        <s:Button x = "94" y = "192" width="86" height="26" label="OK" click="ok_clickHandler(event)" />
        <s:Label x="10" y="10" width="254" height="33" text="Click and drag to reorder, rename and delete layers"/>
    </s:Panel>

「layerlist」を定義し、そこにいくつかのテスト値を追加するスクリプト:

//list of layers in scene. Used in layer list for re-ordering and editing.
            public var layerlist:ArrayCollection = new ArrayCollection(
                [{label: "asd", price: "dsfdf"}]);

--

layerlist.addItem({label: "canoe", price: "dsfdf"});
        layerlist.addItem({label: "coyote", price: "dsfdf"});

そして最後に、ダブルクリックのイベントハンドラー:

protected function layers_doubleClickHandler(event:MouseEvent):void
        {
            // user doubleclicked so rename this layer
            trace("doubleclick");
            trace(event.target.label);

        }

ユーザーがリストの 1 つのエントリをクリックすると、それが "layerlist" からのエントリであるかを知る必要があります。event.target は正しいアイテムを指すと思っていましたが、明らかにそう簡単ではありませんでした。ボタン付きのツールバーを作成し、event.labelを使用してユーザーが押したボタンを見つける前に、この状況では機能しません。

私は何をすべきか?

4

1 に答える 1

2

イベント ハンドラーのターゲットは常に、マウスからのクリックを開始する子です。クリック ポイントに応じて、ラベル、レンダラー、リスト コンテナー内の任意の子にすることができます。event.target を分析するなど、いくつかの回避策を実行できます。

protected function layers_doubleClickHandler(event:Event):void
{
    var item:IItemRenderer;
    if (event.target is IItemRenderer)
        item = event.target as IItemRenderer;
    else if (event.target is Label)
        item = event.target.parent;

    trace(item.label);
}

リストのitemRendererクラスをオーバーライドして、そこからダブルクリックを聞くことができる別の方法。

event bubling in flashについて読んでください。画像を理解するのに役立ちます。

于 2013-01-18T22:01:57.560 に答える