在AS3中拥有拖动功能

时间:2011-09-27 09:57:37

标签: actionscript-3 flash-cs5

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

我这样做:

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的孩子;第二个是我必须调整大小。

我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

感谢大家的答案,但我找到了一个很棒的课程来做我想做的事。

http://www.senocular.com/index.php?id=1.372

http://www.quietless.com/kitchen/transform-tool-drag-scale-and-rotate-at-runtime/

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

调整大小有几个原因是跳跃的。首先,就像rvmook指出的那样,你需要确保在调整大小时支持鼠标滚动。由于AS3中没有onReleaseOutside类型的事件,因此您必须将侦听器设置为舞台或其他一些父剪辑。如果您可以访问舞台,那是最好的。如果没有,您可以使用可调整大小的剪辑的root属性,该属性将引用您具有安全访问权限的最高级别显示对象。将鼠标事件设置为root是有点不可思议的,因为要激活它们,鼠标需要位于root的子资源之一上 - 而当鼠标除了阶段本身之外,该阶段可以触发鼠标事件。

您可能会看到一些奇怪的调整大小行为的另一个原因是因为使用了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的基类。