Actionscript 3 拖动包含可单击子项的容器3

Actionscript 3 拖动包含可单击子项的容器3,actionscript-3,flash,event-handling,Actionscript 3,Flash,Event Handling,我有一个容器,其中包含需要向其注册单击事件的子容器。容器是可拖动的,子容器不应干扰拖动或被拖动触发 我正绞尽脑汁想如何做到这一点。感谢您的帮助 如果对象已移动,则通过删除任何单击处理程序,这是最接近的。这看起来很混乱 box.addEventListener(MouseEvent.MOUSE_DOWN, dragit); box.circle.addEventListener(MouseEvent.CLICK, circleclick); function dragit(e:MouseEve

我有一个容器,其中包含需要向其注册单击事件的子容器。容器是可拖动的,子容器不应干扰拖动或被拖动触发

我正绞尽脑汁想如何做到这一点。感谢您的帮助

如果对象已移动,则通过删除任何单击处理程序,这是最接近的。这看起来很混乱

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

类似于下面的内容对我很有用,你可以从任何地方拖动容器,包括子容器,我添加了一个抑制单击标志以防止单击。如果容器是从子容器拖动的,你可以使用它,也可以不使用它,这取决于你的应用程序

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

    }

}

类似于下面的内容对我很有用,你可以从任何地方拖动容器,包括子容器,我添加了一个抑制单击标志以防止单击。如果容器是从子容器拖动的,你可以使用它,也可以不使用它,这取决于你的应用程序

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

    }

}

你能根据你已经尝试过的内容发布你的代码或伪代码吗?点击是鼠标向下+鼠标向上。但是,当您注册鼠标按下或鼠标向上时,您将无法再获得单击。如果你的鼠标移动超过一定距离(你必须根据你的项目来决定移动什么),你可以拖动鼠标。你可以根据你已经尝试过的内容发布你的代码或伪代码吗?单击是鼠标向下+鼠标向上。但是,当您注册鼠标按下或鼠标向上时,您将无法再获得单击。如果你的鼠标移动超过一定距离(你必须根据你的项目来决定移动的距离),你有一个拖拽。因此,如果鼠标在下鼠标后移动,你只有开始拖拽。一旦鼠标移动,你就设置suppressClick标志,如果suppressClick仍然为假,那么click函数只会触发商品。。。我想我能做到。我一放下鼠标就给startDrag打电话,但如果光标不移动,则不会发生拖动,当收到鼠标向上时,会调用停止拖动,因此不会拖动任何内容。因此,如果鼠标在鼠标向下移动后移动,则只有开始拖动鼠标,并且一旦鼠标移动,则设置SupersClick标志,如果suppressClick仍然为false,则单击功能才会触发其商品。。。我想我可以做到这一点。我在鼠标一放下就调用了
startDrag
,但如果光标不移动,则不会发生拖动,当收到鼠标向上时,会调用停止拖动,因此不会拖动任何东西。