我需要在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的子级;第二个是我必须调整大小的。
我做错了什么?
谢谢!
发布于 2011-09-30 17:36:23
谢谢你的回答,但我找到了一个很棒的课程来做我想做的事情。
http://www.senocular.com/index.php?id=1.372
http://www.quietless.com/kitchen/transform-tool-drag-scale-and-rotate-at-runtime/
发布于 2011-09-27 18:13:02
我不太确定我是否完全明白你的意思。但我认为您的问题出在MOUSE_MOVE处理程序上。
在当前示例中,仅当将鼠标移到目标上时才调整目标的大小。当你以足够快的速度移动鼠标时,你的鼠标可能会离开目标,使其停止调整大小。当我编写自己的拖动处理程序时,我通常会将MOUSE_MOVE和MOUSE_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);
    }
}发布于 2011-09-28 03:57:31
调整大小不稳定有几个原因。首先,就像rvmook指出的那样,你需要确保在调整剪辑大小时支持鼠标滚出剪辑。由于AS3中没有onReleaseOutside类型的事件,因此必须将侦听器设置为舞台或其它父剪辑。如果您有访问舞台的权限,这是最好的。如果不是,则可以使用可调整大小剪辑的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的基类。
https://stackoverflow.com/questions/7567284
复制相似问题