2012-10-10 44 views
0

我正在创建一个Flex Panel,其上有一个图像。我已经将图像的“buttonMode”和“useHandCursor”属性设置为true。所以,每当我做一个鼠标,光标变成一个手工具。我可以在其上设置鼠标右键,鼠标右键移动事件。但是,我发现鼠标移动事件无法正常工作。例如,当用户右键单击Flex面板中的图像,然后在Flex面板外拖动鼠标(同时向右鼠标按下)时,我想在用户拖动鼠标时获取鼠标的当前位置。 但如果我在鼠标上做同样的事情,那么一切正常。任何人都可以引导我为什么我不能在鼠标右键单击这样做?如何在鼠标右键向下事件时在Flex Panel外部获取鼠标位置?

谢谢!

+0

请张贴您的代码。没有看到代码,很难提供任何解决方案。 –

回答

0

假设您正在使用MOUSE_DOWN - > MOUSE_MOVE - > MOUSE_UP过程,您可以使用它。它最初被用作需要平滑拖放的人的答案。你可以看到答案here

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事件侦听器必须连接到舞台上,而不是在面板或图像。您在图像上侦听MOUSE_DOWN(或右键单击),然后添加MOUSE_MOVE和MOUSE_UP事件。我的帧率变化是不必要的,但是为了获得原始提问者想要的平滑拖动,需要进行更改。我还补偿了该代码中对象内的鼠标位置。关键是肯定要将MOUSE_MOVE事件添加到舞台上,并监听stage.mouseX和stage.mouseY,而不是将其添加到面板或图像并侦听target.mouseX/mouseY或event.localX/localY。

我不认为这是用于移动,但如果是,并且您正在使用强制DPI,请确保您使用FlexGlobals.topApplication.systemManager.mouseX/mouseY而不是stage.mouseX和stage.mouseY 。 SystemManager类占DPI变化,Stage类不占用。

+0

嗨,感谢您的回复。我已经实施了相同的逻辑。当我做鼠标左键单击时,这工作正常。但如果我使用相同的代码鼠标右键单击它不起作用。 – Lipika

+0

适合我。只是拿上面贴出的代码,用RIGHT_MOUSE_DOWN和RIGHT_MOUSE_UP替换MOUSE_DOWN和MOUSE_UP。在CS5.5中编译出错,但在Flash Builder构建中工作得很好。 –