2016-07-22 43 views
3

我的問題是:我有一個影片剪輯(obj),用戶可以拖動到雙方導航,我用這個代碼:如何防止拖動操作來影響影片剪輯的兒童

import flash.events.MouseEvent; 
import flash.geom.Point; 
import flash.events.Event; 
import flash.geom.Rectangle; 

var destination: Point = new Point(); 
var dragging: Boolean = false; 
var speed: Number = 10; 
var offset: Point = new Point(); 
var bounds: Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight); 

obj.addEventListener(MouseEvent.MOUSE_DOWN, startdrag); 
stage.addEventListener(MouseEvent.MOUSE_UP, stopdrag); 
obj.addEventListener(Event.ENTER_FRAME, followmouse); 

function startdrag(e: MouseEvent): void { 
    offset.x = obj.mouseX * obj.scaleX; 
    dragging = true; 
} 

function stopdrag(e: MouseEvent): void { 
    dragging = false; 
} 

function followmouse(e: Event): void { 
    if (obj) { 
     if (dragging) { 
      destination.x = mouseX; 
     } 

     obj.x -= (obj.x - (destination.x - offset.x))/speed; 

     if (obj.x > bounds.left) { 
      obj.x = bounds.left; 
     } 

     if (obj.x < -obj.width + bounds.right) { 
      obj.x = -obj.width + bounds.right; 
     } 
    } 
} 

到目前爲止好,問題就來了,當我把一些點擊元素該MovieClip(obj),這裏都爲可點擊元素裏面的代碼:

objA.addEventListener(MouseEvent.CLICK, objATrigger); 
objB.addEventListener(MouseEvent.CLICK, objBTrigger); 
objC.addEventListener(MouseEvent.CLICK, objCTrigger); 

function objATrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

function objBTrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

function objCTrigger(event: MouseEvent): void { 
    MovieClip(this.parent).gotoAndPlay(1, "Main"); 
} 

的問題是:當我拖動影片剪輯(obj )有一個confli在事件發生後,在拖動後釋放鼠標時,影片剪輯(obj)中的影片剪輯事件Click被觸發,我該如何解決這個問題?只有在沒有拖動動作時才能觸發它們。

回答

2

這就是我如何處理拖動可點擊兒童的父項。這種方法的好處是,你不需要對孩子做任何事情(點擊處理程序中沒有額外的條件等),點擊事件根本無法達到它們。

您也可以從希望下面的代碼/註釋閃耀一些效率提示:

var wasDragged:Boolean = false; 
var dragThreshold:Point = new Point(10,10); 
//^how many pixels does it need to move before it's considered a drag 
//this is good especially on touchscreens as it's easy to accidentally drag the item a couple pixels when clicking. 

var dragStartPos:Point = new Point(); //to store drag origin point to calculate whether a drag occured 
var dragOffset:Point = new Point(); //to track the gap between the mouse down point and object's top left corner 

obj.addEventListener(MouseEvent.MOUSE_DOWN, startdrag); 
obj.addEventListener(MouseEvent.CLICK, dragClick, true); //listen on the capture phase of the event. 

//the only reason we listen for click on the draggable object, is to cancel the click event so it's children don't get it 
function dragClick(e:Event):void { 
    //if we deemed it a drag, stop the click event from reaching any children of obj 
    if(wasDragged) e.stopImmediatePropagation(); 
} 

function startdrag(e: MouseEvent): void { 
    //reset all dragging vars 
    wasDragged = false; 
    dragStartPos.x = obj.x; 
    dragStartPos.y = obj.y; 

    //set the offset so the object doesn't jump when first clicked 
    dragOffset.x = stage.mouseX - obj.x; 
    dragOffset.y = stage.mouseY - obj.y; 

    //only add the mouse up listener AFTER the mouse down 
    stage.addEventListener(MouseEvent.MOUSE_UP, stopdrag); 
    //mouse_move is more efficient that enter_frame, and only listen for it when dragging 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, followmouse); 
} 

function stopdrag(e:MouseEvent = null): void { 
    //remove the dragging specific listeners 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stopdrag); 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, followmouse); 
} 

function followmouse(e:MouseEvent): void { 
    if (obj) { 
     //do what you need to move the object 
     obj.x = stage.mouseX - dragOffset.x; 
     obj.y = stage.mouseY - dragOffset.y; 

     //check if the obj moved far enough from the original position to be considered a drag 
     if(!wasDragged 
      && (Math.abs(obj.x - dragStartPos.x) > dragThreshold.x 
      || Math.abs(obj.y - dragStartPos.y) > dragThreshold.y) 
     ){ 
      wasDragged = true; 
     } 
    } 
} 
0

不要在objATrigger函數添加條件檢查,如果拖曳是假

function objATrigger(event: MouseEvent): void { 
    if(!MovieClip(root).dragging){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 
+0

仍然沒有工作,我已經跟蹤的變量,它返回'FALSE' –

+0

嘗試改變的addEventListener到:objA.addEventListener (MouseEvent.MOUSE_DOWN,objATrigger); –

+0

TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。 –

1

我不`噸知道這是不是最好的方法,但它是可以用下面的代碼來檢查:

stage.addEventListener(MouseEvent.MOUSE_DOWN, setmousepos); 
brose_trigger.addEventListener(MouseEvent.MOUSE_UP, broseTrigger); 
denso_trigger.addEventListener(MouseEvent.MOUSE_UP, densoTrigger); 
honda_trigger.addEventListener(MouseEvent.MOUSE_UP, hondaTrigger); 

var mousePos: Point = new Point(); 

function setmousepos(e:MouseEvent): void { 
    mousePos.x = mouseX; 
} 

function broseTrigger(e:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

function densoTrigger(event:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

function hondaTrigger(event:MouseEvent): void { 
    if(mousePos.x == mouseX){ 
     MovieClip(this.parent).gotoAndPlay(1, "Main"); 
    } 
} 

MOUSE_DOWN事件被觸發時,我將mouse.x位置存儲在一個變量中,之後在MOUSE_UP事件中,我將存儲的位置與實際位置進行比較,如果等於,T?D!