2013-04-26 53 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