我需要在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的孩子;第二个是我必须调整大小。
我做错了什么?
谢谢!
答案 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_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);
}
}
答案 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的基类。