2013-04-26 41 views
0

我有了将需要点击注册到他们的活动孩子们的容器。容器是可拖拽的,孩子不应该干扰拖拽或由其触发。拖着点击孩子的容器AS3

我不知道该如何做到这一点。任何帮助表示赞赏。

这是最接近我可以通过删除任何点击处理程序,如果对象已被移动。这似乎凌乱虽然

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

您可以根据您已经尝试过的方式发布您的代码或伪代码吗? – Jordan 2013-04-26 02:26:11

+0

CLICK是MOUSE_DOWN + MOUSE_UP。但是,当您注册MOUSE_DOWN或MOUSE_UP时,您无法再获取CLICK。如果您在MOUSE_UP之前有MOUSE_MOVE大于某个距离(您必须根据您的项目决定什么),则会拖动。 – 2013-04-26 02:31:16

回答

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

    } 

} 
+0

所以你只的startDrag如果鼠标的MOUSE_DOWN后移动,一旦移动设置了supressClick标志和点击功能只触发它的产品,如果suppressClick仍然是假的......我想我可以做这项工作。 – 2013-04-26 02:50:27

+0

嗯,一旦鼠标关闭,我就调用'startDrag',但是如果光标没有移动,那么就不会发生拖动,并且当收到鼠标时停止拖动,所以没有任何东西被拖动。 – 2013-04-26 02:58:44

+1

完美无瑕,设置国旗像一个魅力。 – 2013-04-26 13:32:41