0

我正在创建一个 Flex 面板,上面有一个图像。我已将图像的“buttonMode”和“useHandCursor”属性设置为 true。因此,每当我将鼠标悬停在上面时,光标就会变成手工具。我可以在上面设置鼠标右键、鼠标右键、鼠标移动事件。但是,我看到鼠标移动事件无法正常工作。

例如,当用户右键单击 Flex 面板中的图像然后在 Flex 面板外拖动鼠标(同时按下鼠标右键)时,我想在用户拖动鼠标时获取鼠标的当前位置。但如果我在鼠标按下时做同样的事情,那么一切都会正常工作。谁能指导我为什么我不能用鼠标右键单击?

谢谢!

4

1 回答 1

0

假设您正在使用 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 类不负责。

于 2012-10-10T16:17:29.760 回答