2011-09-27 77 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的。