2011-09-27 40 views
0

我需要在AS3中开发自己的拖动功能(而不是使用startDrag),因为我正在调整MovieClip的大小。自己在AS3中的拖动功能

我这样做:

public class resizeBR extends MovieClip { 

     var initialScaleX, initialScaleY; 

     public function resizeBR() {    
      this.addEventListener(MouseEvent.MOUSE_DOWN, initResize); 
      this.addEventListener(MouseEvent.MOUSE_UP, stopResize); 
     } 

     public function initResize(e:MouseEvent):void 
     { 
      initialScaleX = e.target.scaleX; 
      initialScaleY = e.target.scaleY; 
      e.target.addEventListener(MouseEvent.MOUSE_MOVE, startResize); 
     } 

     public function startResize(e:MouseEvent):void 
     { 
      e.target.x += e.localX; 
      e.target.y += e.localY; 
      e.target.parent.parent.width += mouseX; 
      e.target.parent.parent.height += mouseY; 
      // Keep its own scale 
      e.target.scaleX = initialScaleX; 
      e.target.scaleY = initialScaleY; 

     } 

     public function stopResize(e:MouseEvent):void 
     { 
      e.target.removeEventListener(MouseEvent.MOUSE_MOVE, startResize); 
     } 
    } 

但拖动功能不流利工作。我的意思是,当我从类resizeBR拖动一个MovieClip时,我需要慢慢移动鼠标光标,否则它不会起作用。

resizeBR是MovieClip作为另一个MovieClip的子项;第二个是我必须调整大小。

我在做什么错?

谢谢!

回答

0

我不确定我是否完全理解你的意思。但我认为你的问题在于你的MOUSE_MOVE处理程序。

在您当前的示例中,只有在将鼠标移动到目标上时才调整目标大小。当你移动你的鼠标速度足够快时,你的鼠标可能会离开目标,并使它停止调整大小。当我编写自己的拖动处理程序时,我通常会将MOUSE_MOVEMOUSE_UP听众设置到舞台上。

你的类最终会看起来像这样:

public class resizeBR extends MovieClip 
{ 

    var initialScaleX, initialScaleY; 

    public function resizeBR() 
    {    
     addEventListener(MouseEvent.MOUSE_DOWN, initResize); 
     addEventListener(MouseEvent.MOUSE_UP, stopResize); 
    } 

    public function initResize(e:MouseEvent):void 
    { 
     initialScaleX = scaleX; 
     initialScaleY = scaleY; 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, startResize); 
    } 

    public function startResize(e:MouseEvent):void 
    { 
     x += e.localX; 
     y += e.localY; 
     parent.parent.width += mouseX; 
     parent.parent.height += mouseY; 

     // Keep its own scale 
     scaleX = initialScaleX; 
     scaleY = initialScaleY; 
    } 

    public function stopResize(e:MouseEvent):void 
    { 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, startResize); 
    } 
} 
0

有几个原因,调整大小跳动。首先,像rvmook指出的那样,您需要确保在调整大小的同时支持鼠标滚动剪辑。由于AS3中没有onReleaseOutside类型的事件,因此必须将侦听器设置为舞台或其他父级剪辑。如果你有机会进入舞台,那最好。如果不是,则可以使用可调整大小的剪辑的根属性,该剪辑将引用您具有安全访问权限的最高级别显示对象。将鼠标事件设置为根是有点过分的,因为要让它们触发,鼠标需要位于根的子资产之一上 - 而当鼠标不在舞台上时,舞台可以触发鼠标事件。

您可能会看到一些奇怪的调整大小行为的另一个原因是因为使用localX/Y属性。这些值反映了正在翻转的对象的mouseX/mouseY坐标 - 这可能不一定是您剪辑的直接父对象。

我倾向于避免让类访问其父链。您可能需要考虑将调整大小的逻辑放在您想要调整大小的剪辑中,而不是放在其子节点中的一个中。下面是简单的自我调整例如:

包{

import flash.display.MovieClip; 
import flash.events.MouseEvent; 
import flash.events.Event; 

public class ResizableBox extends MovieClip { 

    public function ResizableBox() { 
     addEventListener(MouseEvent.MOUSE_DOWN, startResize); 
    } 

    private function startResize(evt:MouseEvent):void { 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, handleResize); 
     stage.addEventListener(MouseEvent.MOUSE_UP, stopResize); 
    } 

    private function stopResize(evt:MouseEvent):void { 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, handleResize); 
     stage.removeEventListener(MouseEvent.MOUSE_UP, stopResize); 
    } 

    private function handleResize(evt:MouseEvent):void { 
     this.scaleX = this.scaleY = 1; 
     this.width = this.mouseX; 
     this.height = this.mouseY; 
    } 
} 

}

ResizableBox被设定为在库基类的一个MC的。