假设您正在使用 MOUSE_DOWN -> MOUSE_MOVE -> MOUSE_UP 进程,您可以使用它。它最初被用作想要平滑拖放的人的答案。你可以在这里看到答案。
import flash.display.*;
import flash.events.*;
var startX:Number;
var startY:Number;
var shape:Sprite = new Sprite();
shape.graphics.beginFill(0x000000);
shape.graphics.drawRect(0,0,50,50);
shape.graphics.endFill();
this.addChild(shape);
shape.addEventListener(MouseEvent.MOUSE_DOWN,this.mouseDown);
function mouseDown(e:MouseEvent = null):void{
stage.frameRate = 60;
startX = stage.mouseX - shape.x;
startY = stage.mouseY - shape.y;
stage.addEventListener(MouseEvent.MOUSE_MOVE,this.mouseMove);
shape.addEventListener(MouseEvent.MOUSE_UP,this.mouseUp);
}
function mouseMove(e:MouseEvent = null):void{
shape.x = stage.mouseX - startX;
shape.y = stage.mouseY - startY;
}
function mouseUp(e:MouseEvent = null):void{
shape.removeEventListener(MouseEvent.MOUSE_UP,this.mouseUp);
stage.removeEventListener(MouseEvent.MOUSE_MOVE,this.mouseMove);
stage.frameRate = 24;
}
基本上,要完成您想要的,MOUSE_MOVE 事件侦听器必须附加到舞台,而不是 Panel 或 Image。您在图像上监听 MOUSE_DOWN(或右键单击),然后添加 MOUSE_MOVE 和 MOUSE_UP 事件。我的帧速率更改是不必要的,但为了获得原始提问者想要的平滑拖动是必需的。我还补偿了该代码中对象内的鼠标位置。关键肯定是把MOUSE_MOVE事件加到stage中,监听stage.mouseX和stage.mouseY,而不是加到Panel或者image里监听target.mouseX/mouseY或者event.localX/localY。
我不认为这用于移动设备,但如果是,并且您使用的是强制 DPI,请确保使用 FlexGlobals.topApplication.systemManager.mouseX/mouseY 而不是 stage.mouseX 和 stage.mouseY。SystemManager 类负责 DPI 更改,而 Stage 类不负责。