0

CLICK イベントを登録する必要がある子を持つコンテナーがあります。コンテナーはドラッグ可能であり、子はドラッグを妨害したり、ドラッグによってトリガーされたりしてはなりません。

これを達成する方法に頭を悩ませています。どんな助けでも大歓迎です。

これは、オブジェクトが移動された場合にクリック ハンドラーを削除することで、私ができる最も近い方法です。これは面倒に見えますが

box.addEventListener(MouseEvent.MOUSE_DOWN, dragit);
box.circle.addEventListener(MouseEvent.CLICK, circleclick);


function dragit(e:MouseEvent) 
{
   box.startDrag();
   box.addEventListener(MouseEvent.MOUSE_UP, stopdrag);
}


function stopdrag(e:Event) 
{
if(box.x != 0)
    {
        box.circle.removeEventListener(MouseEvent.CLICK, circleclick);
    }
    box.stopDrag();
}

function circleclick(e:MouseEvent):void
{
trace('clicked');
}
4

1 に答える 1

3

次のようなものは私にとってはうまくいきます。子を含むどこからでもコンテナをドラッグできます。アプリケーションに応じて使用するかどうかにかかわらず、コンテナが子からドラッグされた場合にクリックを防止するためにクリック抑制フラグを追加しました。

package 
{
    public class Main extends Sprite 
    {

        private var container:Sprite = new Sprite();
        private var suppressClick:Boolean = false;

        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);
            // entry point

            container.graphics.beginFill(0xff0000, 1);
            container.graphics.drawRect(0, 0, 500, 500);
            container.graphics.endFill();
            addChild(container);

            container.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

            var child:Sprite = new Sprite();
            child.graphics.beginFill(0x00ff00, 1);
            child.graphics.drawRect(0, 0, 50, 50);
            child.graphics.endFill();
            child.addEventListener(MouseEvent.CLICK, onChildClick);
            child.x = 100;
            child.y = 100;
            container.addChild(child);


        }

        private function onMouseDown(e:MouseEvent):void 
        {
            suppressClick = false;
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            container.startDrag();
        }

        private function onMouseMove(e:MouseEvent):void 
        {
            suppressClick = true;
        }

        private function onMouseUp(e:MouseEvent):void 
        {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            container.stopDrag();
        }

        private function onChildClick(e:MouseEvent):void 
        {
            if(!suppressClick)
                trace("child clicked");
        }

    }

}
于 2013-04-26T02:39:32.413 に答える